Innodb cluster 利用組複製的 pxos 協議,保障數據一致性,組複製支持單主模式和多主模式,html
本文推薦的高可用架構爲單主模式下,基於mysqlrouter的 innodb cluster:mysql
系統:centos 7.5linux
Mysql:8.0.12 二進制包sql
Mysqlshell: 8.0.12 rpm 包shell
Mysql router: 8.0.12 二進制包數據庫
192.168.181.101 my-manager1 Keepalived、MySQL-shell、MySQL-Router、MySQL-clientbootstrap
192.168.181.102 my-manager2 Keepalived、MySQL-shell、MySQL-Router、MySQL-clientvim
192.168.181.103 mysql-1 MySQL服務端、MySQL-shellcentos
192.168.181.104 mysql-2 MySQL服務端、MySQL-shell服務器
192.168.181.105 mysql-3 MySQL服務端、MySQL-shell
172.16.50.191 uatvfc-db-route01
172.16.50.192 uatvfc-db-route02
172.16.50.193 uatvfc-db-route03
172.16.50.197 uatvfc-db-data01
172.16.50.198 uatvfc-db-data02
172.16.50.199 uatvfc-db-data03
yum -y install gcc glibc libaio
(1)、關閉SElinux
setenforce 0
修改/etc/selinux/config
vim /etc/selinux/config
SELINUX=disabled
(2)、關閉防火牆
systemctl stop firewalld
systemctl disable firewalld
cat>>/etc/sysctl.conf <<EOF
fs.aio-max-nr = 1048576
fs.file-max = 681574400
kernel.shmmax = 137438953472
kernel.shmmni = 4096
kernel.sem = 250 32000 100 200
net.ipv4.ip_local_port_range = 9000 65000
net.core.rmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048586
EOF
cat>>/etc/security/limits.conf <<EOF
mysql soft nproc 65536
mysql hard nproc 65536
mysql soft nofile 65536
mysql hard nofile 65536
EOF
cat>>/etc/pam.d/login <<EOF
session required /lib/security/pam_limits.so
session required pam_limits.so
EOF
cat>>/etc/profile<<EOF
if [ $USER = "mysql" ]; then
ulimit -u 16384 -n 65536
fi
EOF
source /etc/profile
User add mysql
環境變量:
0
cd /data
tar -xzvf mysql-8.0.12-el7-x86_64.tar.gz -C /usr/local
mv /usr/local/mysql-8.0.12-el7-x86_64 /usr/local/mysql
chown -R mysql.mysql /usr/local/mysql
mkdir -p /data/mysql_3310_vfc/{data,log,binlog,conf,tmp}
chown -R mysql.mysql /data/mysql_3310_vfc
mkdir -p /data/mysql_3320_vfc/{data,log,binlog,conf,tmp}
chown -R mysql.mysql /data/mysql_3320_vfc
mkdir -p /data/mysql_3330_vfc/{data,log,binlog,conf,tmp}
chown -R mysql.mysql /data/mysql_3330_vfc
su - mysql
Vim /data/mysql_3310_vfc/conf/my.cnf
[mysqld] lower_case_table_names = 1 user = mysql server_id = 197 port = 3310 default-time-zone = '+08:00' enforce_gtid_consistency = ON gtid_mode = ON binlog_checksum = none default_authentication_plugin = mysql_native_password datadir = /data/mysql_3310_vfc/data pid-file = /data/mysql_3310_vfc/tmp/mysqld.pid socket = /data/mysql_3310_vfc/tmp/mysqld.sock tmpdir = /data/mysql_3310_vfc/tmp/ skip-name-resolve = ON open_files_limit = 65535 # open_files_limit does not take effect table_open_cache = 2000 #################innodb######################## innodb_data_home_dir = /data/mysql_3310_vfc/data innodb_data_file_path = ibdata1:512M;ibdata2:512M:autoextend innodb_buffer_pool_size = 6000M innodb_flush_log_at_trx_commit = 1 innodb_io_capacity = 600 innodb_lock_wait_timeout = 120 innodb_log_buffer_size = 8M innodb_log_file_size = 200M innodb_log_files_in_group = 3 innodb_max_dirty_pages_pct = 85 innodb_read_io_threads = 8 innodb_write_io_threads = 8 innodb_thread_concurrency = 32 innodb_file_per_table innodb_rollback_on_timeout innodb_undo_directory = /data/mysql_3310_vfc/data innodb_log_group_home_dir = /data/mysql_3310_vfc/data |
###################session########################### join_buffer_size = 8M key_buffer_size = 256M bulk_insert_buffer_size = 8M max_heap_table_size = 96M tmp_table_size = 96M read_buffer_size = 8M sort_buffer_size = 2M max_allowed_packet = 64M read_rnd_buffer_size = 32M ############log set################### log-error = /data/mysql_3310_vfc/log/mysqld.err log-bin = /data/mysql_3310_vfc/binlog/binlog log_bin_index = /data/mysql_3310_vfc/binlog/binlog.index max_binlog_size = 500M slow_query_log_file = /data/mysql_3310_vfc/log/slow.log slow_query_log = 1 long_query_time = 10 log_queries_not_using_indexes = ON log_throttle_queries_not_using_indexes = 10 log_slow_admin_statements = ON log_output = FILE,TABLE master_info_file = /data/mysql_3310_vfc/binlog/master.info ##########################mgr set############################## mysqlx_port=33102 mysqlx_socket=/data/mysql_3310_vfc/tmp/mysqlx.sock loose-group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa" loose-group_replication_start_on_boot=off loose-group_replication_local_address= "172.16.50.197:33101" loose-group_replication_group_seeds= "172.16.50.197:33101,172.16.50.198:33101,172.16.50.199:33101" loose-group_replication_bootstrap_group= off loose-group_replication_ip_whitelist="172.16.50.0/24" loose-group_replication_single_primary_mode = on
|
大寫的注意: 多主模式存在不少限制和不肯定性問題,不建議使用。具體緣由和讀寫分離解決方案,看下文 |
多主模式下:
loose-group_replication_single_primary_mode = off
操做流程:業務端鏈接IP處理 -> GROUP內成員逐個依次主動退出GROUP (所有退出才行)-> 關閉 group_replication_single_primary_mode參數-> 逐個啓動GROUP內的SERVER
Set global group_replication_single_primary_mode=off
mysqld --defaults-file=/data/mysql_3310_vfc/conf/my.cnf --initialize --user=mysql 日誌中密碼:8?_BO,8k.+DX
mysqld --defaults-file=/data/mysql_3320_vfc/conf/my.cnf --initialize --user=mysql 日誌中密碼:JN&MiMtb5hkj
mysqld --defaults-file=/data/mysql_3330_vfc/conf/my.cnf --initialize --user=mysql 日誌中密碼:v+-/pcu)M3zo
mysqladmin --defaults-file=my.cnf password 'your password';
mysql -uroot -p -S /data/mysql_3310_vfc/tmp/mysql.sock
mysql -uroot -p -S /data/mysql_3320_vfc/tmp/mysql.sock
mysql -uroot -p -S /data/mysql_3330_vfc/tmp/mysql.sock
alter user root@’localhost’ identified by 'your password';
mysql -uroot -p -S /data/mysql_3306_test/tmp/mysqld.sock
create user root@'127.0.0.1' identified by 'your password';
GRANT all ON *.* TO `root`@`127.0.0.1` WITH GRANT OPTION;
create user root@'172.16.50.197' identified by 'your password';
create user root@'172.16.50.198' identified by 'your password';
create user root@'172.16.50.199' identified by 'your password';
create user root@'172.16.50.191' identified by ‘your password’';
create user root@'172.16.50.192' identified by 'your password’;
create user root@'172.16.50.193' identified by ’your password‘;
關閉主庫節點
打包
傳遞
解壓
在作增長從庫的複製是,已經對從庫作了操做,好比增長帳號等,在最開始操做時可讓其不記錄日誌
SET=0;SQL_LOG_BIN
DDL語句;
DML語句;
SET=1;SQL_LOG_BIN
注意修改 server-id 和刪掉 data裏面的auto.conf
rpm -ivh mysql-shell-8.0.11-1.el7.x86_64.rpm
rpm -ivh mysql-router*.rpm
路由節點:這裏有個小技巧,官方建議將路由節點部署在應用端,這樣,應用能夠直接使用 app_user@'127.0.0.1‘這樣的用戶進行訪問
使用mysql命令
(1)、檢查並配置實例(每一個mysql節點)
mysqlsh --log-level=DEBUG3 日誌位置 ~/.mysqlsh/mysqlsh.log
檢查實例
dba.configureLocalInstance('root@127.0.0.1:3310');
dba.chekInstanceConfiguration('root@127.0.0.1:3310')
(2)、建立cluster集羣(確認每一個SQL節點的實例都完成上述實例配置而且驗證成功)
在任意一臺mysql實例節點執行如下命令:
mysqlsh
shell.connect('root@172.16.50.197:3310')
var cluster = dba.createCluster('qwCluster1');
若是建立成功輸出的信息中會有相似「Cluster successfully created.」的語句
將另外兩個節點加入到Cluster集羣中
cluster.addInstance('root@172.16.50.198:3310');
cluster.addInstance('root@172.16.50.199:3310');
cluster.addInstance('root@172.16.50.198:3320');
cluster.addInstance('root@172.16.50.199:3320');
cluster.addInstance('root@172.16.50.198:3330');
cluster.addInstance('root@172.16.50.199:3330');
dba.dropMetadataSchema() 清空集羣
mysql> stop group_replication;
mysql> reset master; (清空日誌,確保和從庫的表沒有衝突奧,)
mysql> reset slave
mysql> stop group_replication;
mysql> reset master;
mysql> reset slave
[Repl] Slave I/O for channel 'group_replication_recovery': error connecting to master 'mysql_innodb_cluster_r0430970923@mysql3:3306' - retry-time: 60 retries: 1, Error_code: MY-002005
[ERROR] [MY-011582] [Repl] Plugin group_replication reported: 'There was an error when connecting to the donor server. Please check that group_replication_recovery channel credentials and all MEMBER_HOST column values of performance_schema.replication_group_members table are correct and DNS resolvable.'
[ERROR] [MY-011583] [Repl] Plugin group_replication reported: 'For details please check performance_schema.replication_connection_status table and error log messages of Slave I/O for channel group_replication_recovery.'
這個問題鬱悶了我好久,
Hostname 是
mysql4
mysql5
mysql6
而我在 /etc/hosts中是
192.168.181.103 mysql-1
192.168.181.103 mysql-2
192.168.181.103 mysql-3
[ERROR] [MY-010586] [Repl] Error running query, slave SQL thread aborted. Fix the problem, and restart the slave SQL thread with "SLAVE START". We stopped at log 'binlog.000007' position 151
[ERROR] [MY-010584] [Repl] Slave SQL for channel 'group_replication_applier': Error executing row event: 'Unknown database 'mysql_innodb_cluster_metadata'', Error_code: MY-001049
重建master reset master
組複製建議,事物隔離級別,read commit
group_replication_enforce_update_everywhere_checks=ON
group_replication_enforce_update_everywhere_checks=ON
多主模式下不支持。這部份內容主要涉及到幾個系統表格,有點相似於 SQL SERVER中的DMV視圖,詳見下表。
庫名 |
表名 |
type |
description |
performance_schema |
replication_group_members |
重要,經常使用 |
查看GROUP成員。 |
performance_schema |
replication_group_member_stats |
重要,經常使用 |
當前SERVER在GROUP中的同步狀況,查看applier通道的同步狀況。 |
performance_schema |
replication_connection_stats |
重要,經常使用 |
當前server中各個通道的使用狀況,applier通道是必定有顯示,recovery通道看是否使用過,若是有則顯示,沒有則不顯示。 |
performance_schema |
replication_applier_stats |
重要,經常使用 |
當前server中各個通道是否啓用。 |
performance_schema |
global_status |
重要,經常使用 |
單主模式下,能夠查看當前主庫是哪一個。 |
performance_schema |
replication_applier_configuration |
不經常使用,瞭解便可 |
|
performance_schema |
replication_applier_status_by_coordinator |
不經常使用,瞭解便可 |
|
performance_schema |
replication_applier_status_by_worker |
不經常使用,瞭解便可 |
|
performance_schema |
replication_connection_configuration |
不經常使用,瞭解便可 |
|
Mysql |
slave_master_info |
重要,不經常使用 |
設置了master_info_repository=TABLE,因此master的相關信息會存儲在這個表格。 |
Mysql |
slave_relay_log_info |
重要,不經常使用 |
設置了relay_log_info_repository=TABLE,因此master的相關信息會存儲在這個表格。 |
l 組複製成員
select * from performance_schema.replication_group_members;
l 組複製狀態
select * from performance_schema.global_status where variable_name like '%group%';
l 單主模式下主庫是哪一個
SELECT * FROM performance_schema.replication_group_members;
SELECT * FROM performance_schema. global_status;
l 檢查數據庫是否正常提供讀寫服務
show global variables like 'super%';
SELECT * FROM performance_schema.replication_group_members;
若是super_read_only是啓動的,那麼該成員僅提供讀服務;
若是super_read_only是關閉的,而且 replication_group_members 中正常的成員n 知足 2n+1 > 整個GROUP成員個數,而且該成員的 member state是online,則該成員可提供讀寫服務。
l 檢查數據庫是否複製出現問題
能夠經過表格replication_group_members ,replication_group_member_stats ,replication_connection_stats ,replication_applier_stats 查看
重點注意各個 組成員的 ERROR LOG詳細信息,由於報錯描述最清楚都在這裏了。
# 在啓動第一個節點時
SET GLOBAL group_replication_bootstrap_group=ON; #表示本節點做爲組複製的起始節點
START GROUP_REPLICATION; #開啓組複製
SET GLOBAL group_replication_bootstrap_group=OFF; # 關閉組複製做爲起始節點
# 啓動其餘節點
START GROUP_REPLICATION;
#關閉組複製
stop group replication
mysqlsh --log-level=debug3
The following functions are currently supported.
- checkInstanceConfiguration 校驗實例配置
- configureInstance 配置實例集羣
- configureLocalInstance 配置本地實例 8.0.11之後放棄了
- createCluster 建立集羣.
- dropMetadataSchema 刪除集羣.
- getCluster 提取cluster 從元數據中
- rebootClusterFromCompleteOutage 當集羣成員都OFFLINE 能夠啓動起來.
e.g. dba.help('configureInstance')
shell.connect('root@192.168.181.103:3306')
var cluster = dba.getCluster()
cluster.status() #集羣狀態查看
var cluster = dba.createCluster('qwCluster')
cluster.describe();
使用一個存在的組複製建立集羣
var cluster = dba.createCluster('qwCluster', {adoptFromGR: true});
dba.dropMetadataSchema()
cluster.removeInstance('root@localhost:3310')
cluster.rejoinInstance()
cluster.checkInstanceState('root@127.0.0.1:3306')
dba.configureInstance('root@192.168.181.103:3306',{mycnfPath:'/data/mysql_3306_test/conf/my.cnf',clusterAdmin:'cadmin@mysql-1%',clusterAdminPassword:'fangfang'})
var cluster = dba.rebootClusterFromCompleteOutage();
官網說,若是配置了innodbcluster 請物本身配置 集羣信息
mysqlrouter --bootstrap root@mysql3:3306 --user=mysqlrouter
設置開機啓動
Systemctl enable mysqlrouter
Systemctl start mysqlrouter
在遠端訪問路由執行命令
mysql -uroot -p -h192.168.181.101 -P6446 -e "select @@hostname";
能夠看到訪問的路徑是輪訓的
l (單主模式)
l (多主模式)
將全部節點所有關機,重啓後
SET GLOBAL group_replication_bootstrap_group=ON;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group=OFF;
全部節點所有關閉的狀況下,宕機狀況下:
var cluster = dba.rebootClusterFromCompleteOutage(‘qwCluster1’);
啓動一個節點,而後其餘節點重啓自動加入
mysqlsh --log-level=debug3
主節點關閉,會當即切換一個從節點爲主庫,mysqlroute 無感知
啓動新的節點,會自動恢復複製狀態,無需關心。
從節點關閉,不影響讀寫,從新啓動數據庫後自動恢復同步。
等同於,有一個節點已經掛掉,沒法啓動。
此時須要添加節點
mysqlbackup是一個熱備份工具、也就是說它不像mysqldump那樣給表上一個全局鎖,因爲mysqldump上了這個鎖,因此就形成客戶端只能對數據庫進行讀操做不能寫,這也就是稱mysqldump爲溫備份的緣由。可是mysqlbackup真的有這麼吊嗎?答案是並無。對於innodb引擎的表mysqlbackup 熱備的;可是對於非innodb表mysqlbackup就只能溫備了,緣由是這類引擎不支持事務也就是說不能經過事務日誌來保證備份的一致性,因此就只能給表加上一個全局鎖來解決了。爲了獲得一致的備份mysqlbackup要不停的去追蹤mysql數據庫的sln號,也就是說mysqlbackup要執行備份那麼它必定要鏈接上數據庫。mysqlbackup對數據庫的備份是經過複製文件的方式進行的,也就是說mysqlbackup要和數據庫在同一臺機器上。
Mysqlbackup 是企業版mysql中的,但能夠拿來使用,登陸oracle雲下載,搜索mysql backup,下載二進制文件
mysql-commercial-backup-8.0.11-linux-glibc2.12-x86_64.tar.gz
傳到主機上並解壓,
會有 bin 和lib 文件夾,將其中的文件拷貝到 /usr/local/mysql 對應的目錄中, 這裏要把 軟鏈接,庫所有拷貝的,否則會報錯
(官方指導命令)
CREATE USER 'mysqlbackup'@'localhost' IDENTIFIED BY 'new-password';
GRANT RELOAD ON *.* TO 'mysqlbackup'@'localhost';
GRANT CREATE, INSERT, DROP, UPDATE ON mysql.backup_progress TO 'mysqlbackup'@'localhost';
GRANT CREATE, INSERT, SELECT, DROP, UPDATE ON mysql.backup_history TO 'mysqlbackup'@'localhost';
GRANT REPLICATION CLIENT ON *.* TO 'mysqlbackup'@'localhost';
GRANT SUPER ON *.* TO 'mysqlbackup'@'localhost';
GRANT PROCESS ON *.* TO 'mysqlbackup'@'localhost';
GRANT ALTER ON mysql.backup_history TO 'mysqlbackup'@'localhost';
GRANT LOCK TABLES, SELECT, CREATE, DROP, FILE ON *.* TO 'mysqlbackup'@'localhost';
GRANT CREATE, INSERT, DROP, UPDATE ON mysql.backup_sbt_history TO 'mysqlbackup'@'localhost';
mysqlbackup --user=mybackup --password=131417 --backup-image=/data/backup/mysql_server.mbi --backup-dir=/data/backup/temp backup-to-image –with-timestap
mysqlbackup –backup-dir=/data/backup/tmp –socket=/data/mysql_3306_test/tmp/mysql.sock –user=root –password=NTg1Z@mYxZjdhZWI –backup-image=/data/backup/full_20180718.bki --with-timestap backup-to-image
mysqlbackup --backup-dir=/backups --backup-image=- backup-to-image > /backup/mybackup.mbi
--user:用戶名。
--password:密碼。
--port:端口,默認值爲3306。
--backup-dir:能夠當作是mysqlback的工做目錄,臨時用的。
--backup-image:備份文件名。
backup-to-image:把全部的備份信息輸出到一個備份文件當中
--with-timepstap: 會自動生成一個帶日期文件夾
備份的操做:先進行全備後進行增備
mysqlbackup --user=mysqlbackup --password=123 --backup-image=backup.mbi --backup-dir=/backup --with-timestamp backup-to-image #先備份成image
mysqlbackup --defaults-file=/etc/my.cnf --user=mysqlbackup --password=123 --with-timestamp --incremental --incremental-backup-dir=/backup/ --incremental-base=dir:/backup/2017-09-18_15-53-57 backup #在原來備份的基礎上進行增量備份
#########備份到其餘服務器
The following command streams the backup as a single-file output to a remote host to be saved under
the file name my_backup.img (--backup-dir=/tmp designates the directory for storing temporary files
rather than the final output file):
mysqlbackup --defaults-file=~/my_backup.cnf --backup-image=- --backup-dir=/tmp backup-to-image | \
ssh <user name>@<remote host name> 'cat > ~/backups/my_backup.img'
./mysqlbackup --backup-image=/home/admin/backups/my.mbi validate
mysqlbackup --backup-image=/backup/my.mbi list-image
mysqlbackup --backup-dir=/backup/backup --backup-image=/backup/2017-09-18_15-53-57/backup.mbi image-to-backup-dir
mysqlbackup --defaults-file=/backup/2017-09-15_17-06-07/server-my.cnf --datadir=/data/mysql --backup-dir=/backup/2017-09-15_17-06-07 copy-back
1 主庫作全備份
備份會鎖myisam表,如master是生產庫,須要注意,可留意業務進程是否有活動的。
/test/mysql/base/bin/mysqlbackup --defaults-file=/test/my3352/my.cnf --socket=/test/my3352/var/mysql.sock --user=root --password --with-timestamp --backup-dir=/test/my3352/backup backup-and-apply-log
2 備份文件拷到從庫主機,作恢復
保證從庫的data和log目錄爲空,用從庫的my.cnf進行恢復
恢復時可能也會將主庫備份的binlog和my.cnf直接恢復到data目錄下,能夠清理掉
mv data data_bak
mv log log_bak
mkdir data
mkdir log
停從庫,清空目錄
mysqlbackup --defaults-file=/test/my3309/my.cnf --backup-dir=/test/myback/BOT/temp copy-back
$ ps -ef | grep my3330
3 啓動從庫
Cd $MYSQL_HOME
mysqld_safe --defaults-file=/test/mydat/$PORT/my.cnf &
mysql -uroot --socket=/test/my3330/var/mysql.sock
4 執行備份文件meta目錄下backup_gtid_executed.sql文件的SET @@GLOBAL.GTID_PURGED語句(可source backup_gtid_executed.sql)
mysql> start slave ;
mysql> show slave status\G
5 按標準change master to
mysql> change master to master_host='10.33.45.152', master_port=3330,master_user='dbsync', master_password='********', master_auto_position=1;
6 start slave。
可能會報ERROR 1872,能夠reset slave後,再從新change master.
ERROR 1872 (HY000): Slave failed to initialize relay log info structure from the repository
將備份恢復到其餘主機上去