青雲Xenon管理mysql主從複製測試

環境:2臺VM虛擬機CentOS7 X86_64 位系統

配置環境要求:

一、2臺虛擬機器要關閉iptables 關閉firewalld, 關閉selinux,開啓時間同步參數,保證2臺虛擬機器的時間是一致的
二、2臺虛擬機的sshd服務要開啓22端口(Xenon代碼中只支持通過22端口來ssh相互之間訪問)
三、Xenon服務啓動用戶要和mysql服務的啓動用戶必須是相同的用戶才行,此實例模擬演示都是採用的系統用戶mysql.
四、2臺虛擬機系統用戶mysql,要允許shell登錄,而且2臺虛擬機mysql用戶之間能互相免祕鑰訪問
五、2臺虛擬機系統上安裝的mysql的版本必須是mysql5.7版本以上(含mysql5.7),而且2臺mysql要開啓半同步複製參數(Xenon是基於半同步複製的)
六、2臺虛擬機系統上都要安裝sshpass軟件
七、2臺虛擬機系統上的Xenon.json配置文件中要調用shell命令來執行相關的命令。由於xenon服務是系統普通用戶mysql啓動的,所以通過xenon.json文件執行命令行命令時,
需要授權mysql系統用戶相關命令的sudo權限,才能夠執行系統命令
八、xenon.json配置文件中要配置幾個賬戶權限,來讓xenon服務能夠自動創建mysql的主從複製關係,以及自動切換mysql複製關係和自動故障恢復等等操作
提示:在xenon.json配置文件中配置mysql複製賬戶和密碼時,xenon服務是能夠自動創建複製賬戶的,並且給的權限是%的權限。並且自動創建複製關係。但是在測試中發現會報錯,提示覆制賬戶權限不正確。

於是在此次演示過程中,本人自己直接在2臺mysql的實例上創建相同的複製賬戶。
命令如下

grant replication slave on *.* to repuser@'172.16.0.%' identified by 'repuser9slave'; flush privileges; ##複製賬戶和密碼 
 grant all on *.* to root@'127.0.0.1' identified by 'rrtestjianwei';flush privileges;  

##在xenon構建的HA+ mysql集羣中,建議讀寫都在master庫上,所以在xenon維護的mysql集羣中,slave庫是不允許寫的.master主庫發生故障後,節點slave庫要發生切換變成主庫,所以原先的只讀權限要通過這個賬戶登錄數據庫修改權限變爲可讀寫

 grant all on *.* to codeuser@'172.16.0.%' identified by 'rrtestjianwei';flush privileges;   

##允許代碼連接庫的賬戶和密碼,以及IP地址,建議此處直接給綁定網卡的服務ip 172.16.0.100作爲唯一的代碼連接庫的地址

九、2臺虛擬機的IP地址和綁定 /etc/hosts

系統IP地址
10.0.0.130  172.16.0.130
10.0.0.131  172.16.0.131

提示:在2臺物理機器上測試的時候,一開始由於2臺物理機器插內網線的網口不相同(一個在網口2,一個在網口3),使得配置內網ip地址的網卡也不相同,在2臺機器xenon.json配置文件中綁定服務ip的到網卡em1上。
雖然後面的測試,2臺機器的上的xenon服務都能成功啓動,並且也可以把各自的mysql服務拉起來,在2臺機器上/data/xenon/bin/xenoncli cluster add ip:8801 添加對方的節點mysql。
並且服務ip也可以成功的綁定到預先設置的em1上。接着後面的問題出現了:在綁定有服務ip的機器上通過這個服務ip和他自身的內網ip是可以登錄數據庫的,但是在沒有綁定服務ip機器上通過這個服務ip登錄對端的mysql服務
居然被拒絕登錄mysql服務(登錄mysql服務的權限確定給的沒問題)
於是讓機房把這2臺內網線重新到插到相同的網卡上,然後在相同的網卡上配置各自的內網ip地址,同時有在xenon.json配置文件中指定綁定服務ip到插內網線的網卡上。此時以上的問題得以解決

綁定 /etc/hosts:

[root@mgr01 ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
172.16.0.130 mgr01
172.16.0.131 mgr03
[root@mgr03 ~]# cat /etc/hosts
172.16.0.130 mgr01
172.16.0.131 mgr03

下面介紹具體的配置步驟

提示:下面的配置步驟要在2臺虛擬機器上都要執行的

第一、安裝二進制版本mysql5.7.24

tar xf  mysql-5.7.24-linux-glibc2.12-x86_64.tar.gz -C /usr/local/
cd /usr/local/
ln -sv mysql-5.7.24-linux-glibc2.12-x86_64 mysql
echo "export PATH=$PATH:/usr/local/mysql/bin" >/etc/profile.d/mysql.sh 
source  /etc/profile
初始化mysql:
mysqld  --defaults-file=/data/mysql/mysql3306/my3306.cnf  --initialize
啓動mysql:
mysqld  --defaults-file=/data/mysql/mysql3306/my3306.cnf  &

[root@mgr01 ~]# cat .my.cnf 
[client]
socket = /tmp/mysql.sock
user=root
password=123456
prompt="(\\u@\\'mgr01':\\p)[\\d]>"

登錄mysql進行賬戶授權:

grant replication slave on *.* to repuser@'172.16.0.%' identified by 'repuser9slave'; flush privileges;
grant all on *.* to root@'127.0.0.1' identified by 'rrtestjianwei';flush privileges;
grant all on *.* to codeuser@'172.16.0.%' identified by 'rrtestjianwei';flush privileges;

提示:2臺機器上都執行上面的步驟安裝mysql.要求/data/mysql/mysql3306/my3306.cnf 配置文件都要開啓MySQL的半同步複製的參數

下面的參數要寫入到/data/mysql/mysql3306/my3306.cnf 配置文件:

plugin-load="semisync_master.so;semisync_slave.so"
rpl_semi_sync_master_enabled=OFF
rpl_semi_sync_slave_enabled=ON
rpl_semi_sync_master_wait_no_slave=ON
rpl_semi_sync_master_timeout=1000000000000000000  ##參數目的就是不讓半同步複製轉化爲異步複製

第二、安裝xenon服務

介紹:
Xenon是一個自包含的二進制文件,在操作系統級別不需要其他系統庫。 它基於Linux構建。 沒有關於MS Windows和OS / X的提示,並且該版本與Windows和OS / X不兼容。
它是一個獨立的應用程序。 配置爲與MySQL後端一起運行時,因此需要mysqld。

Xenon使用GTID半同步並行複製技術,MySQL版本最好是5.7或更高版本。 有關詳細信息,請參見my.cnf
地址:https://github.com/radondb/xenon/blob/master/docs/config/MySQL.md
下面的mysql的半同步複製參數要寫入到/data/mysql/mysql3306/my3306.cnf 配置文件

plugin-load="semisync_master.so;semisync_slave.so"
rpl_semi_sync_master_enabled=OFF
rpl_semi_sync_slave_enabled=ON
rpl_semi_sync_master_wait_no_slave=ON
rpl_semi_sync_master_timeout=1000000000000000000

由於xenon服務是go語言開發的,所以需要go環境來運行,且要求需要Go版本1.8或更高版本

2.1安裝go環境

需要Go版本1.8或更高版本(對於ubuntu是“ sudo apt install golang”,對於centOS / redhat是“ yum install golang”)。
採用二進制安裝golang ,版本是go1.9.3.linux-amd64.tar.gz
go 二進制包下載地址:
wget  https://storage.googleapis.com/golang/go1.9.3.linux-amd64.tar.gz
tar xf go1.11.linux-amd64.tar.gz  -C /usr/local/

[root@mgr01 ~]# tail -2 /etc/profile
export GOROOT=/usr/local/go
export PATH=$PATH:$GOROOT/bin
[root@mgr01 ~]# go version
go version go1.11 linux/amd64

2.2 安裝xenon服務

1下載:
git clone https://github.com/radondb/xenon.git
cd xenon
2.編譯構建
make build
 ls bin/
xenon  xenoncli
3.配置config
 cp xenon/conf/xenon-sample.conf.json /etc/xenon/xenon.json

[mysql@mgr01 ~]$ cat /data/xenon/bin/config.path
/etc/xenon/xenon.json

這裏需要注意的是,運行xenon的帳戶必須與mysql帳戶一致,例如使用ubuntu帳戶啓動xenon,它需要ubuntu mysql的啓動和mysql目錄的權限。
這與傳統的mysql地方不一樣,不需要mysql帳戶,運行xenon帳戶的同事就是mysql帳戶。

注意:以下是命令行示例的摘要。 爲簡單起見,我們假設xenon在您的指定的路徑下。 如果不是,replace xenon with /path/to/xenon.
在xenon命令路徑中,您需要有一個名爲config.path的文件,它是xenon.json文件的絕對路徑。 確保使用-c或--config指定xenon_config_file的位置。

2.3、2臺機器創建系統用戶mysql

2臺機器創建系統用戶mysql並且2臺機器之間實現mysql用戶免祕鑰訪問,而且mysql系統賬戶只能是22端口才能訪問

useradd mysql
passwd mysql
授權mysql用戶sudo權限可以執行下面的命令:

 [root@mgr01 ~]# tail -1 /etc/sudoers
mysql ALL=(ALL)     NOPASSWD: /usr/sbin/ip

2臺虛擬機之間系統用戶mysql相互免祕鑰操作:

 ssh-keygen -t rsa 
 .ssh/authorized_keys
 chmod 600 .ssh/authorized_keys 

2.4、啓動xenon服務:

172.16.0.130 機器xenon.json內容如下:(172.16.0.131配置文件要把IP跟換成自己內網卡172.16.0.131地址)


[mysql@mgr01 ~]$ cat /etc/xenon/xenon.json 
{
    "server":
    {
        "endpoint":"172.16.0.130:8801"
    },

    "raft":
    {
        "meta-datadir":"raft.meta",
        "heartbeat-timeout":1000,
        "election-timeout":3000,
        "leader-start-command":"sudo /usr/sbin/ip a a 172.16.0.100/16 dev eth0 && arping -c 3 -A  172.16.0.100  -I eth0",
        "leader-stop-command":"sudo /usr/sbin/ip a d 172.16.0.100/16 dev eth0"
    },

    "mysql":
    {
        "admin":"root",
        "passwd":"rrtestjianwei",
        "host":"127.0.0.1",
        "port":3306,
        "basedir":"/usr/local/mysql",
        "defaults-file":"/data/mysql/mysql3306/my3306.cnf",
        "ping-timeout":1000,
        "master-sysvars":"super_read_only=0;read_only=0;sync_binlog=default;innodb_flush_log_at_trx_commit=default",
        "slave-sysvars": "super_read_only=1;read_only=1;sync_binlog=1000;innodb_flush_log_at_trx_commit=2"
    },

    "replication":
    {
        "user":"repuser",
        "passwd":"repuser9slave"
    },

    "backup":
    {
        "ssh-host":"172.16.0.130",
        "ssh-user":"mysql",
        "ssh-passwd":"rrtestjianwei669",
        "ssh-port":22,
        "backupdir":"/data/mysql/mysql3306/data",
        "xtrabackup-bindir":"/usr/bin",
        "backup-iops-limits":100000,
        "backup-use-memory": "1GB",
        "backup-parallel": 2
    },

    "rpc":
    {
        "request-timeout":500
    },

    "log":
    {
        "level":"INFO"
    }
}

啓動命令:
172.16.0.130機器操作:

[mysql@mgr01 ~]$ /data/xenon/bin/xenon -c /etc/xenon/xenon.json > /data/xenon/xenon.log 2>&1 &

添加xenon節點

[mysql@mgr01 xenon]$  /data/xenon/bin/xenoncli  cluster add 172.16.0.131:8801
 2019/12/08 23:13:29.937943       [WARNING]     cluster.prepare.to.add.nodes[172.16.0.131:8801].to.leader[]
 2019/12/08 23:13:29.938024       [WARNING]     cluster.canot.found.leader.forward.to[172.16.0.130:8801]
 2019/12/08 23:13:29.950792       [WARNING]     cluster.add.nodes.to.leader[].done

查看xenon節點:

[mysql@mgr01 ~]$ /data/xenon/bin/xenoncli  cluster status
+-------------------+--------------------------------+---------+---------+--------------------------+---------------------+----------------+-------------------+
|        ID         |              Raft              | Mysqld  | Monitor |          Backup          |        Mysql        | IO/SQL_RUNNING |     MyLeader      |
+-------------------+--------------------------------+---------+---------+--------------------------+---------------------+----------------+-------------------+
| 172.16.0.130:8801 | [ViewID:16 EpochID:1]@LEADER   | RUNNING | ON      | state:[NONE]␤            | [ALIVE] [READWRITE] | [true/true]    | 172.16.0.130:8801 |
|                   |                                |         |         | LastError:               |                     |                |                   |
+-------------------+--------------------------------+---------+---------+--------------------------+---------------------+----------------+-------------------+
| 172.16.0.131:8801 | [ViewID:16 EpochID:1]@FOLLOWER | RUNNING | ON      | state:[NONE]␤            | [ALIVE] [READONLY]  | [true/true]    | 172.16.0.130:8801 |
|                   |                                |         |         | LastError:               |                     |                |                   |
+-------------------+--------------------------------+---------+---------+--------------------------+---------------------+----------------+-------------------+
(2 rows)
操作完成過6s後,有最初的都是read_only變成了一個[READONLY和一個READWRITE

172.16.0.131機器操作:

[mysql@mgr03 ~]$ /data/xenon/bin/xenon -c /etc/xenon/xenon.json > /data/xenon/xenon.log 2>&1 &
[mysql@mgr03 ~]$ /data/xenon/bin/xenoncli  cluster add 172.16.0.130:8801

[mysql@mgr03 ~]$ /data/xenon/bin/xenoncli  cluster status
+-------------------+--------------------------------+---------+---------+--------------------------+---------------------+----------------+-------------------+
|        ID         |              Raft              | Mysqld  | Monitor |          Backup          |        Mysql        | IO/SQL_RUNNING |     MyLeader      |
+-------------------+--------------------------------+---------+---------+--------------------------+---------------------+----------------+-------------------+
| 172.16.0.131:8801 | [ViewID:16 EpochID:1]@FOLLOWER | RUNNING | ON      | state:[NONE]␤            | [ALIVE] [READONLY]  | [true/true]    | 172.16.0.130:8801 |
|                   |                                |         |         | LastError:               |                     |                |                   |
+-------------------+--------------------------------+---------+---------+--------------------------+---------------------+----------------+-------------------+
| 172.16.0.130:8801 | [ViewID:16 EpochID:1]@LEADER   | RUNNING | ON      | state:[NONE]␤            | [ALIVE] [READWRITE] | [true/true]    | 172.16.0.130:8801 |
|                   |                                |         |         | LastError:               |                     |                |                   |
+-------------------+--------------------------------+---------+---------+--------------------------+---------------------+----------------+-------------------+
操作完成過6s後,有最初的都是read_only變成了一個[READONLY和一個READWRITE

同時服務IP172.16.0.100地址綁定到了10.0.0.130 的機器上

[mysql@mgr01 xenon]$ ip a|grep 172.16.0.100
    inet 172.16.0.100/16 scope global eth0

通過服務ip登錄mysql,然後創建測試庫:

[mysql@mgr01 xenon]$ mysql -ucodeuser -h172.16.0.100 -p'rrtestjianwei' -e "create database test03;show databases;"
mysql: [Warning] Using a password on the command line interface can be insecure.
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test01             |
| test02             |
| test03             |
+--------------------+
[mysql@mgr01 xenon]$ 

第三、xenon管理mysql一主一從故障演示

進行故障演示,kill 掉主庫,嘗試通過服務ip連接庫,大約25s才能鏈接成功主庫,然後在連接後的新主庫進行刪除數據
主庫切換在25s就可以完成

進行故障演示,
1.登錄master庫,執行shutdown關掉主庫,嘗試通過服務ip連接庫,大約17s到20s才能重新綁定服務ip到master庫的機器網卡上,然後通過這個服務ip成功連接主庫,然後就可以操作對數據庫的進行查看,寫入,更新數據了
(物理服務器多次測試得出的)

2.登錄master庫的服務器,kill -9 掉mysql的進程, 然後master機器上的xenon會在4s到11s內自動把master機器的mysql服務拉起來,然後在綁定服務ip到master的網卡上,然後通過這個服務ip成功連接主庫,就可以操作對數據庫的進行查看,寫入,更新數據了
(物理服務器多次測試得出的)

3..登錄master庫的服務器,移走數據目錄data,關閉master庫的mysql服務,此時雖然經過1m分鐘左右服務ip已經飄到另外一臺mysql,但是此時,這個庫只能讀,不行寫。寫入時會夯築 (物理服務器多次測試得出的)

4.如果只是shutdown關閉slave庫的話,通過服務ip地址遠程寫入一條記錄然後在關閉此mysql實例;
命令如下:

[root@slavedb 3306]# mysql -ucodeuser -h192.168.1.100 -p'rrtestjianwei' -e "INSERT INTO test01.test1(username,password,create_time) values('tomcat', 'xiaohuahua',now());"; mysql -e "shutdown;

在執行完shutdown命令後,然後立刻執行下面的插入記錄的命令:

mysql -ucodeuser -h192.168.1.100 -p'rrtestjianwei' -e "INSERT INTO test01.test1(username,password,create_time) values('tomcat', 'xiaohuahua',now());"

此時會夯築,連續執行多次的話都不行,持續的時間在10-15s,纔可以正常寫入,但是此時相同的記錄會被寫入2次到master庫上。(物理服務器多次測試得出的)
如下:

| 31 | tomcat   | xiaohuahua | 2019-12-12 17:20:11 |
| 32 | tomcat   | xiaohuahua | 2019-12-12 17:23:28 |
| 33 | tomcat   | xiaohuahua | 2019-12-12 17:23:28 |
| 34 | tomcat   | xiaohuahua | 2019-12-12 17:23:38 |
| 35 | tomcat   | xiaohuahua | 2019-12-12 17:23:40 |
| 36 | tomcat   | xiaohuahua | 2019-12-12 17:25:32 |
| 37 | tomcat   | xiaohuahua | 2019-12-12 17:25:32 |
| 38 | tomcat   | xiaohuahua | 2019-12-12 17:25:45 |
+----+----------+------------+---------------------+

5.如果把slave庫的data目錄移走,通過服務ip地址遠程寫入一條記錄然後在關閉此mysql實例;
命令如下:

[root@slavedb ~]#  mv data data_bak
[root@slavedb 3306]# ls
binlog  data_bak  logs  my.cnf  tmp
[root@slavedb ~]# mysql -ucodeuser -h192.168.1.100 -p'rrtestjianwei' -e "INSERT INTO test01.test1(username,password,create_time)values('tomcat', 'xiaohuahua',now());";mysql -e "shutdown;"
[mysql@localhost xenon]$ mysql -ucodeuser -h192.168.1.100 -p'rrtestjianwei' -e "INSERT INTO test01.test1(username,password,create_time) values('tomcat', 'xiaohuahua',now());"

持續的夯築時間在10-15s之間,纔可以正常寫入,但是此時相同的記錄會被寫入2次到master庫上。(物理服務器多次測試得出的)

 39 | tomcat   | xiaohuahua | 2019-12-12 17:37:31 |
| 40 | tomcat   | xiaohuahua | 2019-12-12 17:37:31 |
| 41 | tomcat   | xiaohuahua | 2019-12-12 17:37:42 |
| 42 | tomcat   | xiaohuahua | 2019-12-12 17:37:43 |
+----+----------+------------+---------------------+
42 rows in set (0.00 sec)

創建測試表,插入測試語句:

CREATE TABLE `test1` (
`id` int(8) NOT NULL AUTO_INCREMENT, 
`username` varchar(20) COLLATE utf8_unicode_ci NOT NULL,
`password` varchar(20) COLLATE utf8_unicode_ci NOT NULL, 
`create_time` varchar(20) COLLATE utf8_unicode_ci NOT NULL, 
PRIMARY KEY (`id`) #主鍵ID
) ENGINE=innodb AUTO_INCREMENT=0 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

INSERT INTO test1(username,password,create_time) values('tomcat', 'xiaohuahua',now());
INSERT INTO test1(username,password,create_time) values('tomcat', 'xiaohuahua',now());

下面是dellR620物理機器上配置命令:


 /data/xenon/bin/xenon -c /etc/xenon/xenon.json > /data/xenon/xenon.log 2>&1 &
 /data/xenon/bin/xenoncli cluster status
 /data/xenon/bin/xenoncli cluster add 192.168.1.39:8801,192.168.1.182:8801
  /data/xenon/bin/xenoncli cluster remove 192.168.1.105:8801
 sudo /usr/sbin/ip a a 192.168.1.100/32 dev em3 && arping -c 3 -A  192.168.1.100  -I em3

 sudo /usr/sbin/ip a d 192.168.1.100/32 dev em3

下面是dellR620物理機器上創建數據庫賬戶的命令:

grant replication slave on *.* to repl@'192.168.1.%' identified by 'repl4slave'; flush privileges;
grant all on *.* to root@'127.0.0.1' identified by 'rrtestjianwei';flush privileges;
grant all on *.* to codeuser@'192.168.1.%' identified by 'rrtestjianwei';flush privileges;

下面是dellR620物理機器上其中一臺的xenon.json配置文件內容 :


[root@slavedb ~]# cat /etc/xenon/xenon.json 
{
    "server":
    {
        "endpoint":"192.168.1.39:8801"
    },

    "raft":
    {
        "meta-datadir":"raft.meta",
        "heartbeat-timeout":1000,
        "election-timeout":3000,
        "leader-start-command":"sudo /usr/sbin/ip a a 192.168.1.100/32 dev em3 && arping -c 3 -A  192.168.1.100  -I em3",
        "leader-stop-command":"sudo /usr/sbin/ip a d 192.168.1.100/32 dev em3"
    },

    "mysql":
    {
        "admin":"root",
        "passwd":"rrtestjianwei",
        "host":"127.0.0.1",
        "port":3306,
        "basedir":"/usr/local/mysql",
        "defaults-file":"/data/mysql/3306/my.cnf",
        "ping-timeout":1000,
        "master-sysvars":"super_read_only=0;read_only=0;sync_binlog=default;innodb_flush_log_at_trx_commit=default",
        "slave-sysvars": "super_read_only=1;read_only=1;sync_binlog=1000;innodb_flush_log_at_trx_commit=2"
    },

    "replication":
    {
        "user":"repl",
        "passwd":"repl4slave"
    },

    "backup":
    {
        "ssh-host":"192.168.1.39",
        "ssh-user":"mysql",
        "ssh-passwd":"rrtestjianwei669",
        "ssh-port":22,
        "backupdir":"/data/mysql/3306/data",
        "xtrabackup-bindir":"/usr/bin",
        "backup-iops-limits":100000,
        "backup-use-memory": "1GB",
        "backup-parallel": 2
    },

    "rpc":
    {
        "request-timeout":500
    },

    "log":
    {
        "level":"INFO"
    }
}

以上是簡單的介紹演示,記錄在此,方便自己查閱,也希望可以幫助有需要的網友們

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章