Gtid+MGR+atlas読み書き分離および負荷分散高可用性アーキテクチャ


MySQL5.7.24 Gtid+MGR+atlas読み書き分離及び負荷等化高可用性アーキテクチャ
一.サーバ環境の紹介:
テンセントクラウドのクラウドホストは360オープンソースのmysql中間キーAtlasテンセントクラウドマシンの外部ネットワークip:19.29.97.131滄州233をインストールして物理マシンの外部ネットワークip 192をテストする.168.1.233(安全のためにわざとイントラネットに書いたipは、実はイントラネットipです)
二.mysqlGtid+MGRインストール
参考ブログアドレス:https://blog.51cto.com/wujianwei/2336812
三.中間キーAtlasの概要
(抜粋:https://github.com/Qihoo360/Atlas)
AtlasはQihoo 360社のWebプラットフォーム部インフラストラクチャチームが開発・維持するMySQLプロトコルに基づくデータ中間層プロジェクトである.MySQLが公式に発表したMySQL-Proxy 0.8.2バージョンに加え、多くのバグを修正し、多くの機能特性を追加しました.現在、このプロジェクトは360社内で広く応用されており、多くのMySQL業務がAtlasプラットフォームに接続されており、毎日の読み書き要求数は数十億件に達している.また、50社以上の企業が生産環境にAtlasを導入し、800人以上が開発者のコミュニケーショングループに参加し、これらの数字は増加しています.主な機能:1.読み書き分離2.ライブラリからの負荷分散3.IPフィルタ4.自動分割表5.DBAは上下線DB 6を滑らかにすることができる.ダウンタイムDBの自動取り外し
公式リンク:https://github.com/Qihoo360/Atlas
Atlasの構成パラメータおよび原理の詳細については、次の文書を参照してください.https://github.com/Qihoo360/Atlas/wiki/Atlas部分配置パラメータと原理の詳細
Atlasの実行およびよくある質問については、次の文書を参照してください.https://github.com/Qihoo360/Atlas/wiki/Atlasの運用およびFAQ
四.Atlasのインストールと構成手順:
wget    https://github.com/Qihoo360/Atlas/releases/download/2.2.1/Atlas-2.2.1.el6.x86_64.rpm
yum  -y localinstall Atlas-2.2.1.el6.x86_64.rpm

Atlas     
/usr/local/mysql-proxy/bin/mysql-proxyd mgrmul start
/usr/local/mysql-proxy/bin/mysql-proxyd mgrmul stop
/usr/local/mysql-proxy/bin/mysql-proxyd mgrmul status
/usr/local/mysql-proxy/bin/mysql-proxyd mgrmul restart

4.1 Atlasプロファイルの編集:
データベース内のユーザーの準備
   MGR mysql3306    ,mysql3307  mysql3308  slave  
   mysql3306      sql    ,      mysql3307  mysql3308 
grant all on *.* to jianweiuser@'119.29.97.131' identified by 'jianwei@559886';flush privileges;

テンセントクラウドのクラウドホストにログインしてリモートで192.168.1.233マシンのmysqlインスタンスにログインできるかどうかをテストします
 mysql -ujianweiuser -p'jianwei@559886' -h192.168.1.233 -P3306
 mysql -ujianweiuser -p'jianwei@559886' -h192.168.1.233 -P3307
 mysql -ujianweiuser -p'jianwei@559886' -h192.168.1.233 -P3308

テストはログイン可能です
データベースを使用するユーザーパスワードの暗号化:/usr/local/mysql-proxy/bin/encrypt jianweiuserの実行
パスワード列W 7 moDRl 9 VZ 8 jaj+4 argKVA==atlasのプロファイルmgrmulに追加する.cnf
プロファイルの詳細パラメータの説明の参考:https://github.com/Qihoo360/Atlas/wiki/Atlasのインストール
4.2プレゼンテーション環境で使用可能なプロファイルの内容は次のとおりです.
[root@VM_82_178_centos ~]# cat /usr/local/mysql-proxy/conf/mgrmul.cnf 
[mysql-proxy]

# #           

#        
admin-username = zykjwtest

#       
admin-password = zykjwtest01

#Atlas     MySQL   IP   ,     ,     
proxy-backend-addresses=192.168.1.233:3306,192.168.1.233:3307,192.168.1.233:3308
#Atlas     MySQL   IP   ,@         ,       ,       1,     ,     
proxy-read-only-backend-addresses = 192.168.1.233:3307@1,192.168.1.233:3308@1

#            MySQL  ,    PREFIX/bin        encrypt  ,   user1 user2   ,       MySQL         !
pwds = 01test:XU7LYbEX2MY62nXU/3RMPA==, jianweiuser:XU7LYbEX2MY12rq2Ryj6/g==

#  Atlas     ,  true        ,  false      ,         false,       true,true       。
daemon = true

#  Atlas     ,  true Atlas       ,   monitor,   worker,monitor worker            ,  false   worker,  monitor,         false,       true,true       。
keepalive = true

#     , Atlas        ,         
event-threads = 4

#    ,  message、warning、critical、error、debug    
log-level = warning

#       
log-path = /usr/local/mysql-proxy/log

#SQL     ,    OFF、ON、REALTIME,OFF     SQL  ,ON    SQL  ,REALTIME    SQL         ,   OFF
sql-log = REALTIME

#       。        ,            sql-log-slow(  :ms)     。             。
#sql-log-slow = 10

#    ,          Atlas      
instance = mgrmul

#Atlas       IP   
proxy-address = 0.0.0.0:1200

#Atlas       IP   
admin-address = 0.0.0.0:1300

#    ,   person   ,mt   ,id     ,3     ,     ,     ,            
#tables = person.mt.id.3

#     ,              SET NAMES  
#charset = utf8

#    Atlas     IP,     IP,    IP ,     ,           IP  ,         IP  
client-ips = 127.0.0.1, 192.168.1, 119.29.97.131

#Atlas     LVS      IP(     IP),  LVS    client-ips       ,       
#lvs-ips = 192.168.1.1
[root@VM_82_178_centos ~]# 

4.3 Atlas重要パラメータの紹介:

(1)Atlas     

proxy-address   ,  proxy-address = 0.0.0.0:1200         1200      Atlas   SQL  。

(2)Atlas     

admin-address   ,  admin-address = 0.0.0.0:1300  DBA    1300      Atlas         。

(3)           

admin-username  admin-password   ,        Atlas      ,      MySQL    ,        ,   MySQL         。

(4)         ,     mysql               ,           
pwds = 01test:XU7LYbEX2MY62nXU/3RMPA==, jianweiuser:XU7LYbEX2MY12rq2Ryj6/g==

(5)    Atlas     IP,     IP,    IP ,     ,          > IP  ,         IP  
client-ips = 127.0.0.1, 192.168.1, 119.29.97.131

(6)#SQL     ,    OFF、ON、REALTIME,OFF     SQL  ,ON    SQL  ,REALTIME    SQL         ,   OFF
sql-log = REALTIME  ###        ,       , sql     SQL   

(7)mgrmul.cnf       instance   
mgrmul conf          ,       instance    ,      
[root@VM_82_178_centos conf]# grep mgrmul /usr/local/mysql-proxy/conf/mgrmul.cnf 
instance = mgrmul

五.Atlasアプリケーションのデモ
5.1 Atlasの管理ポートのデモ:
Atlas管理インタフェースにログインして動的にmysqlをオンラインとオフラインのノードを行い、各mysqlノードの状態を表示し、ログイン可能なクライアントのip情報を表示し、オンラインでクライアントのipを追加と削除してAtlasをリンクすることができ、オンラインで現在Atlasにログインできるユーザーを表示し、オンラインでAtlasを追加と削除できるアカウントとパスワードを表示することができます.オンラインでデータを追加してAtlasのプロファイルなどに保存できる
[root@VM_82_178_centos ~]# mysql -uzykjwtest -p'zykjwtest01' -P1300
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1045 (28000): Access denied for user 'zykjwtest'@'localhost' (using password: YES)
[root@VM_82_178_centos ~]# mysql -uzykjwtest -p'zykjwtest01' -h127.0.0.1 -P1300

[email protected] [(none)]>SELECT * FROM help;
+----------------------------+---------------------------------------------------------+
| command                    | description                                             |
+----------------------------+---------------------------------------------------------+
| SELECT * FROM help         | shows this help                                         |
| SELECT * FROM backends     | lists the backends and their state                      |
| SET OFFLINE $backend_id    | offline backend server, $backend_id is backend_ndx's id |
| SET ONLINE $backend_id     | online backend server, ...                              |
| ADD MASTER $backend        | example: "add master 127.0.0.1:3306", ...               |
| ADD SLAVE $backend         | example: "add slave 127.0.0.1:3306", ...                |
| REMOVE BACKEND $backend_id | example: "remove backend 1", ...                        |
| SELECT * FROM clients      | lists the clients                                       |
| ADD CLIENT $client         | example: "add client 192.168.1.2", ...                  |
| REMOVE CLIENT $client      | example: "remove client 192.168.1.2", ...               |
| SELECT * FROM pwds         | lists the pwds                                          |
| ADD PWD $pwd               | example: "add pwd user:raw_password", ...               |
| ADD ENPWD $pwd             | example: "add enpwd user:encrypted_password", ...       |
| REMOVE PWD $pwd            | example: "remove pwd user", ...                         |
| SAVE CONFIG                | save the backends to config file                        |
| SELECT VERSION             | display the version of Atlas                            |
+----------------------------+---------------------------------------------------------+
16 rows in set (0.01 sec)

[email protected] [(none)]>SELECT * FROM backends; 
+-------------+--------------------+-------+------+
| backend_ndx | address            | state | type |
+-------------+--------------------+-------+------+
|           1 | 192.168.1.233:3306 | up    | rw   |
|           2 | 192.168.1.233:3307 | up    | rw   |
|           3 | 192.168.1.233:3308 | up    | rw   |
|           4 | 192.168.1.233:3307 | up    | ro   |
|           5 | 192.168.1.233:3308 | up    | ro   |
+-------------+--------------------+-------+------+
5 rows in set (0.00 sec)
[email protected] [(none)]>

5.2 Aatlas負荷等化機能:
ヒント:テンセントクラウドホストは自機の外網のipがAtlasのポートにアクセスすることを許可します:1200だからテンセントクラウドのコンソールの安全なグループの中で運行するクラウドホストの外網のipが1200ポートにアクセスすることを設置します
読み取り専用負荷等化テスト:select@@port、ポート区分が異なる読み取り可能mysqlインスタンスから表示されます.
[root@VM_82_178_centos ~]#  mysql -ujianweiuser -p'jianwei@559886' -h127.0.0.1 -P1200
[email protected] [(none)]>select @@port;
+--------+
| @@port |
+--------+
|   3307 |
+--------+
1 row in set (0.04 sec)

[email protected] [(none)]>select @@port;
+--------+
| @@port |
+--------+
|   3308 |
+--------+
1 row in set (0.05 sec)

[email protected] [(none)]>

[root@VM_82_178_centos ~]# tailf /usr/local/mysql-proxy/log/sql_mgrmul.log 
[12/29/2018 22:03:08] C:127.0.0.1:34600 S:192.168.1.233:3307 OK 43.210 "select @@port"
[12/29/2018 22:03:11] C:127.0.0.1:34600 S:192.168.1.233:3308 OK 42.856 "select @@port"

SQLログから見た負荷分散機能
5.3 Atlas読み書き分離テスト
読み書き分離テスト:Atlasエージェントのメカニズムは、プロファイルに記録されている書き込み可能なノードの最初の書き込みにのみ使用可能であることを決定し、最初の書き込みが使用できない場合は2番目にアクセスし、使用可能なものが見つかるまでホストにのみ書き込みます.読むとプロファイル内のすべての読み取り可能なノードから読みます.
mysql -ujianweiuser -p'jianwei@559886' -h127.0.0.1 -P1200
  
mysql -ujianweiuser -p'jianwei@559886' -h119.29.97.131 -P1200

テスト用のテストテーブルを作成するには、次の手順に従います.
create database test01;use test01;
CREATE TABLE `test01` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `titles` char(15) NOT NULL,
  `icon` smallint(6) unsigned DEFAULT '0',
  `integral` int(10) NOT NULL DEFAULT '0',
  `isdefault` tinyint(1) unsigned NOT NULL DEFAULT '0',
`create_time` varchar(20) COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`id`),
  KEY `integral` (`integral`)
) ENGINE=Innodb AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;

insert into test01.test01 values(1,'  ',1,0,1,now());
insert into test01.test01 values(2,'  ',2,1000,1,now());

sqlログを表示すると、読み書き分離が実現されていることがわかります.
[root@VM_82_178_centos ~]# tailf /usr/local/mysql-proxy/log/sql_mgrmul.log
[12/29/2018 22:07:23] C:127.0.0.1:34600 S:192.168.1.233:3306 OK 50.116 "create database test01"
[12/29/2018 22:07:23] C:127.0.0.1:34600 S:192.168.1.233:3307 OK 43.100 "SELECT DATABASE()"
[12/29/2018 22:07:23] C:127.0.0.1:34600 S:192.168.1.233:3307 OK 86.225 "show databases"
[12/29/2018 22:07:24] C:127.0.0.1:34600 S:192.168.1.233:3308 OK 85.390 "show tables"
[12/29/2018 22:07:35] C:127.0.0.1:34600 S:192.168.1.233:3306 OK 148.760 "CREATE TABLE `test01` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `titles` char(15) NOT NULL,
  `icon` smallint(6) unsigned DEFAULT '0',
  `integral` int(10) NOT NULL DEFAULT '0',
  `isdefault` tinyint(1) unsigned NOT NULL DEFAULT '0',
`create_time` varchar(20) COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`id`),
  KEY `integral` (`integral`)
) ENGINE=Innodb AUTO_INCREMENT=0 DEFAULT CHARSET=utf8"
[12/29/2018 22:09:00] C:127.0.0.1:34600 S:192.168.1.233:3306 OK 95.845 "insert into test01.test01 values(1,'  ',1,0,1,now())"
[12/29/2018 22:09:01] C:127.0.0.1:34600 S:192.168.1.233:3306 OK 96.185 "insert into test01.test01 values(2,'  ',2,1000,1,now())"
[12/29/2018 22:09:37] C:127.0.0.1:34600 S:192.168.1.233:3306 OK 86.894 "select * from test01.test01"
[12/29/2018 22:09:39] C:127.0.0.1:34600 S:192.168.1.233:3307 OK 86.323 "select * from test01.test01"
[12/29/2018 22:11:19] C:119.29.97.131:35378 S:192.168.1.233:3308 OK 277.726 "select @@version_comment limit 1"
[12/29/2018 22:11:19] C:119.29.97.131:35378 S:192.168.1.233:3307 OK 277.027 "select USER()"

masteインスタンスmysql 3306のデモを閉じる
[root@localhost ~]#/etc/init.d/mysqld stopShutting down MySQL............. SUCCESS! [root@localhost ~]#
test 02ライブラリとtest 02テストテーブルを作成します.
mysql -ujianweiuser -p'jianwei@559886' -h119.29.97.131 -P1200

create database test02;use test02;
CREATE TABLE `test02` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `titles` char(15) NOT NULL,
  `icon` smallint(6) unsigned DEFAULT '0',
  `integral` int(10) NOT NULL DEFAULT '0',
  `isdefault` tinyint(1) unsigned NOT NULL DEFAULT '0',
`create_time` varchar(20) COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`id`),
  KEY `integral` (`integral`)
) ENGINE=Innodb AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;

insert into test02.test02 values(1,'  ',1,0,1,now());
insert into test02.test02 values(2,'  ',2,1000,1,now());

select * from test01.test01;select * from test02.test02;

ライトライブラリがmysql 3307インスタンスに切り替わり、リードライブラリがmysql 3307とmysql 3308インスタンスの間で輪訓的に切り替わることが分かった.

[root@VM_82_178_centos ~]# tailf /usr/local/mysql-proxy/log/sql_mgrmul.log 

[12/29/2018 22:23:15] C:119.29.97.131:36168 S:192.168.1.233:3308 OK 42.392 "select @@version_comment limit 1"
[12/29/2018 22:23:15] C:119.29.97.131:36168 S:192.168.1.233:3307 OK 41.100 "select USER()"
[12/29/2018 22:25:20] C:119.29.97.131:36168 S:192.168.1.233:3307 OK 304.954 "create database test02"
[12/29/2018 22:25:20] C:119.29.97.131:36168 S:192.168.1.233:3308 OK 42.489 "SELECT DATABASE()"
[12/29/2018 22:25:21] C:119.29.97.131:36168 S:192.168.1.233:3308 OK 85.458 "show databases"
[12/29/2018 22:25:21] C:119.29.97.131:36168 S:192.168.1.233:3307 OK 77.739 "show tables"
[12/29/2018 22:25:21] C:119.29.97.131:36168 S:192.168.1.233:3307 OK 139.017 "CREATE TABLE `test02` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `titles` char(15) NOT NULL,
  `icon` smallint(6) unsigned DEFAULT '0',
  `integral` int(10) NOT NULL DEFAULT '0',
  `isdefault` tinyint(1) unsigned NOT NULL DEFAULT '0',
`create_time` varchar(20) COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`id`),
  KEY `integral` (`integral`)
) ENGINE=Innodb AUTO_INCREMENT=0 DEFAULT CHARSET=utf8"
[12/29/2018 22:25:21] C:119.29.97.131:36168 S:192.168.1.233:3307 OK 93.835 "insert into test02.test02 values(1,'  ',1,0,1,now())"
[12/29/2018 22:25:24] C:119.29.97.131:36168 S:192.168.1.233:3307 OK 92.871 "insert into test02.test02 values(2,'  ',2,1000,1,now())"
[12/29/2018 22:27:53] C:119.29.97.131:36168 S:192.168.1.233:3307 OK 85.442 "select * from test01.test01"
[12/29/2018 22:27:53] C:119.29.97.131:36168 S:192.168.1.233:3308 OK 84.813 "select * from test02.test02"

ヒント:以上のMGRはmulti master方式で実証されていますが、デフォルトのsingle masterモードを採用すると、read-onlyなどの再選主に問題が発生し、新しい主ライブラリが書き込めないことをヒントにします.
Gtid+MGR+atlas読み書き分離と負荷均衡高可用性アーキテクチャのプレゼンテーションはこれで終わり、学生たちと一緒に交流し、勉強することを歓迎します.