MySQL ( MGR ) 09 - 现有的复制组迁移到InnoDB Cluster

  1. 克隆 MySQL ( MGR ) 01 后的VM & 修改配置(本次为 214节点)
[root@xag200 ~]# hostname
xag214

[root@xag200 ~]# cat /etc/hostname
xag214

[root@xag200 ~]# cat /etc/sysconfig/network
NETWORKING=yes
NOZEROCONF=yes
HOSTNAME=xag214

[root@xag200 ~]# cat /etc/hosts
...
192.168.40.211 xag211 xag211
192.168.40.212 xag212 xag212
192.168.40.213 xag213 xag213
192.168.40.214 xag214 xag214

[root@xag200 ~]# cat  /etc/sysconfig/network-scripts/ifcfg-ens33
。。。
IPADDR="192.168.40.211"
。。。

[root@xag200 ~]# reboot
  1. 在管理节点(xag214)安装mysql shell 和 mysql-route
[root@xag214 src]# pwd
/usr/local/src

wget https://downloads.mysql.com/archives/get/p/43/file/mysql-shell-1.0.11-linux-glibc2.12-x86-64bit.tar.gz

wget https://downloads.mysql.com/archives/get/p/41/file/mysql-router-2.1.6-linux-glibc2.12-x86-64bit.tar.gz

scp mysql-shell-1.0.11-linux-glibc2.12-x86-64bit.tar.gz root@xag211:/usr/local/src/
scp mysql-shell-1.0.11-linux-glibc2.12-x86-64bit.tar.gz root@xag212:/usr/local/src/
scp mysql-shell-1.0.11-linux-glibc2.12-x86-64bit.tar.gz root@xag213:/usr/local/src/

[root@xag214 src]# ll
-rw-r--r-- 1 root root 15630562 Feb  3 21:47 mysql-router-2.1.6-linux-glibc2.12-x86-64bit.tar.gz
-rw-r--r-- 1 root root  6584245 Feb  3 21:47 mysql-shell-1.0.11-linux-glibc2.12-x86-64bit.tar.gz

tar -zvxf mysql-router-2.1.6-linux-glibc2.12-x86-64bit.tar.gz
tar -zvxf mysql-shell-1.0.11-linux-glibc2.12-x86-64bit.tar.gz

mv mysql-router-2.1.6-linux-glibc2.12-x86-64bit mysql-route
mv mysql-shell-1.0.11-linux-glibc2.12-x86-64bit mysql-shell

mv mysql-route /usr/local/
mv mysql-shell /usr/local/

vim /etc/profile
..............
export PATH=$PATH:/usr/local/mysql-shell/bin/:/usr/local/mysql-route/bin/
 
source /etc/profile
 
[root@xag214 local]# mysqlprovision --version
mysqlprovision version 2.1.0

[root@xag214 local]# mysqlsh --version
mysqlsh   Ver 1.0.11 for Linux on x86_64 - for MySQL 5.7.20 (MySQL Community Server (GPL))

[root@xag214 local]# mysqlrouter --version
MySQL Router v2.1.6 on Linux (64-bit) (GPL community edition)
  1. 在三个cluster节点(211,212,213)安装和部署 mysql-shell
cd /usr/local/src/

[root@xag211 src]# ll
-rw-r--r-- 1 root root  6584245 Feb  3 21:47 mysql-shell-1.0.11-linux-glibc2.12-x86-64bit.tar.gz

tar -zvxf mysql-shell-1.0.11-linux-glibc2.12-x86-64bit.tar.gz

mv mysql-shell-1.0.11-linux-glibc2.12-x86-64bit mysql-shell

mv mysql-shell /usr/local/
 
echo "export PATH=$PATH:/usr/local/mysql-shell/bin/" >> /etc/profile

source /etc/profile
 
mysqlprovision --version                          
 
mysqlsh --version      

4.创建Innodb Cluster集群
4.1 修改 /etc/my.cnf 中 #复制框架设置 及 #组复制设置 如下(xag212、xag213类似)
各个MGR节点除了server_id、loose-group_replication_local_address、report_host 三个参数不一样外,其他保持一致。

#复制框架设置
server-id = 211
# 表示本机的序列号为1,如果做主从,或者多实例,serverid一定不能相同。
log-bin = /usr/local/mysql/binlog/binlog 
# logbin数据库的操作日志,例如update、delete、create等都会存储到binlog日志,通过logbin可以实现增量恢复
binlog_format = row
gtid_mode=ON
enforce_gtid_consistency=ON
binlog_checksum=NONE
log_slave_updates=ON
master_info_repository =TABLE
relay_log_info_repository=TABLE
 
#组复制设置
#server必须为每个事务收集写集合,并使用XXHASH64哈希算法将其编码为散列
transaction_write_set_extraction=XXHASH64
#告知插件加入或创建组命名,UUID
loose-group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
#server启动时不自启组复制,为了避免每次启动自动引导具有相同名称的第二个组,所以设置为OFF。
loose-group_replication_start_on_boot=off
#告诉插件使用IP地址,端口24901用于接收组中其他成员转入连接
loose-group_replication_local_address="xag211:24901"
#启动组server,种子server,加入组应该连接这些的ip和端口;其他server要加入组得由组成员同意
loose-group_replication_group_seeds="xag211:24901,xag212:24901,xag213:24901"
loose-group_replication_bootstrap_group=off
loose-group_replication_single_primary_mode = on 
loose-group_replication_allow_local_disjoint_gtids_join=on
disabled_storage_engines = MyISAM,BLACKHOLE,FEDERATED,CSV,ARCHIVE
report_host=xag211
report_port=3306

4.2 在 211 上创建集群,通过 211 上的 shell 连接211 的 mysql

root@xag211:(none) [:43: ] 10 SQL->
select * from performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| group_replication_applier | 2116c7e9-63c9-11eb-a1ba-000c299e2211 | xag211      |        3306 | ONLINE       |
| group_replication_applier | 2126c7e9-63c9-11eb-a1ba-000c299e2212 | xag212      |        3306 | ONLINE       |
| group_replication_applier | 2136c7e9-63c9-11eb-a1ba-000c299e2213 | xag213      |        3306 | ONLINE       |
+---------------------------+--------------------------------------+-------------+-------------+--------------+

SELECT a.member_id,a.member_host,member_port,member_state
,if(b.variable_name is not null,'PRIMARY','SECONDDARY') as MEMBER_ROLE 
FROM performance_schema.replication_group_members a left join performance_schema.global_status b
on b.variable_name='group_replication_primary_member' and b.variable_value=a.member_id;

+--------------------------------------+-------------+-------------+--------------+-------------+
| member_id                            | member_host | member_port | member_state | MEMBER_ROLE |
+--------------------------------------+-------------+-------------+--------------+-------------+
| 2119f22b-6136-11eb-a433-000c29905211 | xag211      |        3306 | ONLINE       | PRIMARY     |
| 2129f22b-6136-11eb-a433-000c29905212 | xag212      |        3306 | ONLINE       | SECONDARY   |
| 2139f22b-6136-11eb-a433-000c29905213 | xag213      |        3306 | ONLINE       | SECONDARY   |
+--------------------------------------+-------------+-------------+--------------+-------------+

#登录
mysqlsh --uri root@xag211:3306

#创建集群
mysql-js> var cluster = dba.createCluster('myCluster', {adoptFromGR: true});
--------------------------------------------------------------------------------------------------------
A new InnoDB cluster will be created on instance 'root@xag211:3306'.

Creating InnoDB cluster 'myCluster' on 'root@xag211:3306'...
Adding Seed Instance...

Cluster successfully created. Use Cluster.addInstance() to add MySQL instances.
At least 3 instances are needed for the cluster to be able to withstand up to
one server failure.
-------------------------------------------------------------------------------------------------------
mysql-js> cluster.status();
{
    "clusterName": "myCluster", 
    "defaultReplicaSet": {
        "name": "default", 
        "primary": "xag211:3306", 
        "status": "OK", 
        "statusText": "Cluster is ONLINE and can tolerate up to ONE failure.", 
        "topology": {
            "xag211:3306": {
                "address": "xag211:3306", 
                "mode": "R/W", 
                "readReplicas": {}, 
                "role": "HA", 
                "status": "ONLINE"
            }, 
            "xag212:3306": {
                "address": "xag212:3306", 
                "mode": "R/O", 
                "readReplicas": {}, 
                "role": "HA", 
                "status": "ONLINE"
            }, 
            "xag213:3306": {
                "address": "xag213:3306", 
                "mode": "R/O", 
                "readReplicas": {}, 
                "role": "HA", 
                "status": "ONLINE"
            }
        }
    }
}
-------------------------------------------------------------------------------------------

执行成功后会自动创建一个新的数据库: mysql_innodb_cluster_metadata, 
用于存放集群的元数据, 该元数据会被MySQL Router用到, 以实现高可用性.
  1. 启动管理节点的route
进入 xag214 管理节点中mysql-router 安装目录,配置并启动 router

[root@xag214 local]# pwd
/usr/local

[root@xag214 local]# /usr/local/mysql-route/bin/mysqlrouter --bootstrap root@xag211:3306 -d myrouter --user=root
----------------------------------------------------------------------------------------------------------
Please enter MySQL password for root: 

Bootstrapping MySQL Router instance at /usr/local/myrouter...
MySQL Router  has now been configured for the InnoDB cluster 'myCluster'.

The following connection information can be used to connect to the cluster.

Classic MySQL protocol connections to cluster 'myCluster':
- Read/Write Connections: localhost:6446
- Read/Only Connections: localhost:6447

X protocol connections to cluster 'myCluster':
- Read/Write Connections: localhost:64460
- Read/Only Connections: localhost:64470
---------------------------------------------------------------------------------------------------------
[root@xag214 local]# ls
bin  etc  games  include  lib  lib64  libexec  myrouter  mysql  mysql-route  mysql-shell  sbin  servers  share  src

会在当前目录下产生mysql-router 目录, 并生成router配置文件,接着把配置文件修改一下
[root@xag214 local]# pwd
/usr/local

[root@xag214 local]# ls myrouter
data  log  mysqlrouter.conf  mysqlrouter.key  run  start.sh  stop.sh

[root@xag214 myrouter]# pwd
/usr/local/src/myrouter

[root@xag214 local]# cat /usr/local/myrouter/mysqlrouter.conf
#可以修改配置文件, 也可以默认不修改

然后启动mysqlroute
[root@xag214 ~]# /usr/local/myrouter/start.sh

[root@xag214 local]# ps -ef|grep myroute
root       1323      1  0 23:16 pts/0    00:00:00 sudo ROUTER_PID=/usr/local/myrouter/mysqlrouter.pid /usr/local/mysql-route/bin/mysqlrouter -c /usr/local/myrouter/mysqlrouter.conf --user=root
root       1324   1323  0 23:16 pts/0    00:00:00 /usr/local/mysql-route/bin/mysqlrouter -c /usr/local/myrouter/mysqlrouter.conf --user=root
root       1336   1257  0 23:16 pts/0    00:00:00 grep --color=auto myroute

[root@xag214 local]# netstat -tunlp | grep 1324 
tcp        0      0 0.0.0.0:64460           0.0.0.0:*               LISTEN      1324/mysqlrouter    
tcp        0      0 0.0.0.0:6446            0.0.0.0:*               LISTEN      1324/mysqlrouter    
tcp        0      0 0.0.0.0:6447            0.0.0.0:*               LISTEN      1324/mysqlrouter    
tcp        0      0 0.0.0.0:64470           0.0.0.0:*               LISTEN      1324/mysqlrouter 

6.测试

[root@xag211 ~]# mysql -u root -h xag214 -P 6446 -p

root@xag214:(none) [:21: ] 1 SQL->use testdb

root@xag214:testdb [:21: ] 2 SQL->select * from t1;
+----+----------+
| Id | TestName |
+----+----------+
|  1 | a        |
|  2 | b        |
+----+----------+

root@xag214:testdb [:21: ] 3 SQL->delete from t1 where Id=2;
Query OK, 1 row affected (0.01 sec)

---------------------------------------------------------------------------------------------
[root@xag211 ~]# mysql -u root -h xag214 -P 6447 -p

root@xag214:(none) [:22: ] 1 SQL->use testdb

root@xag214:testdb [:22: ] 2 SQL->delete from t1 where Id=1;
ERROR 1290 (HY000): The MySQL server is running with the --super-read-only option so it cannot execute this statement

  1. 停止集群 & 停 myroute & 停 mysql
root@xag211:testdb [:25: ] 21 SQL->select * from performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| group_replication_applier | 2116c7e9-63c9-11eb-a1ba-000c299e2211 | xag211      |        3306 | ONLINE       |
| group_replication_applier | 2126c7e9-63c9-11eb-a1ba-000c299e2212 | xag212      |        3306 | ONLINE       |
| group_replication_applier | 2136c7e9-63c9-11eb-a1ba-000c299e2213 | xag213      |        3306 | ONLINE       |
+---------------------------+--------------------------------------+-------------+-------------+--------------+

[root@xag214 local]# mysqlsh --uri root@xag211:3306

mysql-js> \sql
Switching to SQL mode... Commands end with ;

mysql-sql> stop group_replication;

root@xag211:testdb [:25: ] 22 SQL->select * from performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| group_replication_applier | 2116c7e9-63c9-11eb-a1ba-000c299e2211 | xag211      |        3306 | OFFLINE      |
+---------------------------+--------------------------------------+-------------+-------------+--------------+

root@xag211:testdb [:30: ] 23 SQL->select * from t1;
+----+----------+
| Id | TestName |
+----+----------+
|  1 | a        |
+----+----------+


[root@xag214 local]# /usr/local/myrouter/stop.sh 

[root@xag214 local]# ps -ef|grep myroute
root       1348   1257  0 23:24 pts/0    00:00:00 grep --color=auto myroute


# 各节点停 mysql 
service mysqld stop

  1. 启动InnoDB Cluster
# 各节点启动 mysql 
service mysqld start

#使用mysql shell 连接集群服务器
[root@xag214 ~]# mysqlsh --uri root@xag211:3306

#重启集群
dba.rebootClusterFromCompleteOutage('myCluster'); 
var cluster = dba.getCluster('myCluster')                #获取当前集群
or

mysql-js> var cluster = dba.rebootClusterFromCompleteOutage();
------------------------------------------------------------------------------------------------
Reconfiguring the default cluster from complete outage...

The instance 'xag212:3306' was part of the cluster configuration.
Would you like to rejoin it to the cluster? [y|N]: y

The instance 'xag213:3306' was part of the cluster configuration.
Would you like to rejoin it to the cluster? [y|N]: y

The MySQL instance at 'xag211:3306' currently has the super_read_only 
system variable set to protect it from inadvertent updates from applications. 
You must first unset it to be able to perform any changes to this instance. 
For more information see: https://dev.mysql.com/doc/refman/en/server-system-variables.html#sysvar_super_read_only.

Note: there are open sessions to 'xag211:3306'.
You may want to kill these sessions to prevent them from performing unexpected updates: 

1 open session(s) of 'root@xag211'. 

1 open session(s) of 'root@xag214'. 

Do you want to disable super_read_only and continue? [y|N]: y


The cluster was successfully rebooted.
------------------------------------------------------------------------------------------------------------
mysql-js> cluster.status()
-----------------------------------------------------------------------------
{
    "clusterName": "myCluster", 
    "defaultReplicaSet": {
        "name": "default", 
        "primary": "xag211:3306", 
        "status": "OK_NO_TOLERANCE", 
        "statusText": "Cluster is NOT tolerant to any failures. 2 members are not active", 
        "topology": {
            "xag211:3306": {
                "address": "xag211:3306", 
                "mode": "R/W", 
                "readReplicas": {}, 
                "role": "HA", 
                "status": "ONLINE"
            }, 
            "xag212:3306": {
                "address": "xag212:3306", 
                "mode": "R/O", 
                "readReplicas": {}, 
                "role": "HA", 
                "status": "(MISSING)"
            }, 
            "xag213:3306": {
                "address": "xag213:3306", 
                "mode": "R/O", 
                "readReplicas": {}, 
                "role": "HA", 
                "status": "(MISSING)"
            }
        }
    }
}
----------------------------------------------------------------------------------

#如果查询节点状态为:
 "status": "(MISSING)"
#重新加入命令
var cluster = dba.getCluster('myCluster')  
cluster.rejoinInstance("root@xag212:3306")
#如果rejoinInstance失败,提示remove重新添加如下:
cluster.removeInstance('root@xag212:3306');
cluster.addInstance('root@xag212:3306');

#如果rejoinInstance失败,提示remove重新添加如下:
cluster.removeInstance('root@xag213:3306');
cluster.addInstance('root@xag213:3306');

mysql-js> cluster.status()
------------------------------------------------------------------------------------
{
    "clusterName": "myCluster", 
    "defaultReplicaSet": {
        "name": "default", 
        "primary": "xag211:3306", 
        "status": "OK", 
        "statusText": "Cluster is ONLINE and can tolerate up to ONE failure.", 
        "topology": {
            "xag211:3306": {
                "address": "xag211:3306", 
                "mode": "R/W", 
                "readReplicas": {}, 
                "role": "HA", 
                "status": "ONLINE"
            }, 
            "xag212:3306": {
                "address": "xag212:3306", 
                "mode": "R/O", 
                "readReplicas": {}, 
                "role": "HA", 
                "status": "ONLINE"
            }, 
            "xag213:3306": {
                "address": "xag213:3306", 
                "mode": "R/O", 
                "readReplicas": {}, 
                "role": "HA", 
                "status": "ONLINE"
            }
        }
    }
}
-----------------------------------------------------------------------
然后启动mysqlroute
[root@xag214 ~]# /usr/local/myrouter/start.sh

[root@xag211 ~]# mysql -u root -h xag214 -P 6446 -p

root@xag214:(none) [:21: ] 1 SQL->use testdb

root@xag214:testdb [:09: ] 2 SQL->select * from t1;
+----+----------+
| Id | TestName |
+----+----------+
|  1 | a        |
+----+----------+

cat /usr/lib/systemd/system/mysqlrouter.service

[Unit]
Description=MYSQL Router
After=syslog.target
After=network.target
 
[Service]
Type=simple
User=root
Group=root
  
ExecStart=/usr/local/mysql-route/bin/mysqlrouter -c /usr/local/myrouter/mysqlrouter.conf
PrivateTmp=true
LimitNOFILE = 65535

[Install]
WantedBy=multi-user.target
[root@c7-node1 ~]# systemctl enable mysqlrouter
[root@c7-node1 ~]# systemctl start mysqlrouter
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,367评论 6 512
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,959评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,750评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,226评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,252评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,975评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,592评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,497评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,027评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,147评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,274评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,953评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,623评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,143评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,260评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,607评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,271评论 2 358

推荐阅读更多精彩内容