環境:2臺VM虛擬機CentOS7 X86_64 位系統node
1、2臺虛擬機器要關閉iptables 關閉firewalld, 關閉selinux,開啓時間同步參數,保證2臺虛擬機器的時間是一致的
2、2臺虛擬機的sshd服務要開啓22端口(Xenon代碼中只支持經過22端口來ssh相互之間訪問)
3、Xenon服務啓動用戶要和mysql服務的啓動用戶必須是相同的用戶才行,此實例模擬演示都是採用的系統用戶mysql.
4、2臺虛擬機系統用戶mysql,要容許shell登陸,並且2臺虛擬機mysql用戶之間能互相免祕鑰訪問
5、2臺虛擬機系統上安裝的mysql的版本必須是mysql5.7版本以上(含mysql5.7),並且2臺mysql要開啓半同步複製參數(Xenon是基於半同步複製的)
6、2臺虛擬機系統上都要安裝sshpass軟件
7、2臺虛擬機系統上的Xenon.json配置文件中要調用shell命令來執行相關的命令。因爲xenon服務是系統普通用戶mysql啓動的,因此經過xenon.json文件執行命令行命令時,
須要受權mysql系統用戶相關命令的sudo權限,纔可以執行系統命令
8、xenon.json配置文件中要配置幾個帳戶權限,來讓xenon服務可以自動建立mysql的主從複製關係,以及自動切換mysql複製關係和自動故障恢復等等操做
提示:在xenon.json配置文件中配置mysql複製帳戶和密碼時,xenon服務是可以自動建立複製帳戶的,而且給的權限是%的權限。而且自動建立複製關係。可是在測試中發現會報錯,提示覆制帳戶權限不正確。mysql
因而在這次演示過程當中,本人本身直接在2臺mysql的實例上建立相同的複製帳戶。
命令以下:linux
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庫要發生切換變成主庫,因此原先的只讀權限要經過這個帳戶登陸數據庫修改權限變爲可讀寫git
grant all on *.* to codeuser@'172.16.0.%' identified by 'rrtestjianwei';flush privileges;
##容許代碼鏈接庫的帳戶和密碼,以及IP地址,建議此處直接給綁定網卡的服務ip 172.16.0.100做爲惟一的代碼鏈接庫的地址github
9、2臺虛擬機的IP地址和綁定 /etc/hostsgolang
系統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到插內網線的網卡上。此時以上的問題得以解決sql
綁定 /etc/hosts:shell
[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臺虛擬機器上都要執行的數據庫
第1、安裝二進制版本mysql5.7.24json
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 ##參數目的就是不讓半同步複製轉化爲異步複製
第2、安裝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.三、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.四、啓動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]$
進行故障演示,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" } }
以上是簡單的介紹演示,記錄在此,方便本身查閱,也但願能夠幫助有須要的網友們