爲何要設置mysql集羣?mysql
爲了減輕,mysql服務器的IO壓力,設置多個其餘mysql服務器幫他分擔讀寫操做
sql
1.mysql複製集羣的類型
數據庫
主從架構(從服務器只讀,不可寫)後端
一主一從,bash
一主多重服務器
主主架構架構
2.複製原理併發
1)若主服務器上的數據集較大,則須要咱們將主服務器數據庫全部內容作備份,而後發送給從服務器,隨後獲取二進制日誌的文件,及其座標用於後續的數據同步ide
2)所謂同步,是主服務器上的二進制日誌中的SQL語句,發送到從服務器上的中繼日誌文件中,而後把這些SQL語句重放實現同步測試
3.與主從複製相關的線程
從服務器上:IO線程:用來鏈接主服務器的,監控二進制日誌的變化,並接受的
SQL線程:監控,讀取,而且重放中繼日誌中的SQL語句,並把數據寫入服務器數據庫中;
主服務器上:DUMP線程:將slave請求的二進制日誌發送過去
4.主從複製的過程:
1.主服務器數據發生修改,寫入數據庫中,而且記錄二進制日誌文件中
2.slave的IO線程複製發生變化的二進制日誌,而且記錄到本身的中繼日誌中
3.slave的SQL線程,將複製過來的中繼日誌作重放,保持和master上數據的一致;
5.主從複製注意內容:
1.保證每一個服務器的server_id設置不一樣,(後面讀寫分離作測試方便)
2.主服務器上開啓二進制日誌文件
3.從服務器關閉二進制日誌文件,開啓中繼日誌文件,而且設置read_only=ON
4.主服務器設置參數sync_binlog=1(每發生一次數據變化,就將變化內容寫入二進制日誌中)
innodb_flush_log_at_trx_commit=1(沒提交一個事務,就將事務日誌保存到磁盤中)
5.記得記錄二進制日誌的文件名和座標
6.在主服務器上受權一個能夠用於主從複製的用戶
6.主從複製實例
主服務器文件配置
innodb_file_per_table=ON //開啓innodb的單獨表空間 skip_name_resolve=ON //跳過主機名解析 log_bin=binlog server_id=123 sync_binlog=1 innodb_flush_log_at_trx_commit=1
從服務器文件配置
innodb_file_per_table=ON skip_name_resolve=ON relay_log=slavelog server_id=7 read_only=ON
主服務器作數據備份併發給從服務器
MariaDB [(none)]> show master status; //記錄此時二進制日誌文件及座標 +---------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +---------------+----------+--------------+------------------+ | binlog.000015 | 617 | | | +---------------+----------+--------------+------------------+ 1 row in set (0.00 sec) MariaDB [(none)]> grant replication slave on *.* to 'vuser'@'%' identified by '111111'; //受權一個用於主從複製的用戶 Query OK, 0 rows affected (0.02 sec) [root@bogon ~]# mysqldump --all-databases --lock-all-tables > gg.sql //複製當前數據庫併發給從服務器 [root@bogon ~]# scp gg.sql root@172.16.0.155:/root
從服務器上操做
MariaDB [zz]> \. /root/gg.sql //使用發送過來的數據庫文件,初始化數據庫 創建主從鏈接: MariaDB [zz]> change master to master_host='172.16.0.156',master_user='vuser',master_password='111111',master_port=3306,master_log_file='binlog.000015',master_log_pos=617; MariaDB [zz]> start slave; 開啓從服務器 MariaDB [zz]> show slave status\G; 查看主從狀態 *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event //若顯示此行則配置成功 Master_Host: 172.16.0.156 Master_User: vuser Master_Port: 3306 Connect_Retry: 60 Master_Log_File: binlog.000015 Read_Master_Log_Pos: 831 Relay_Log_File: slavelog.000002 Relay_Log_Pos: 740 Relay_Master_Log_File: binlog.000015 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 831 Relay_Log_Space: 1027 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: 0 Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 123 1 row in set (0.00 sec)
若想關閉主從配置,須要在從服務器使用命令stop slave便可
二.雙主複製
兩個服務器,同時開啓二進制日誌文件和中繼日誌文件;並相互作change master to操做便可
三.讀寫分離(前提:主從複製)
mysqlrouter
原理
經過調用倆個不一樣的接口,將mysql語句分別調用
安裝:mysqlrouter,配置配置文件/etc/mysqlrouter/mysqlrouter.conf
[routing:master] 添加倆個配置段//master 接口 bind_address = 172.16.0.155:40001 //綁定的ip地址和端口號 destinations = 172.16.0.156:3306 //後端的mysql服務 mode = read-write //模式(是否容許寫) connect_time = 3 //鏈接時間 [routing:slave] bind_address = 172.16.0.155:40002 destinations = 172.16.0.155:3306 mode = read-only connect_time = 1
配置完成能夠啓動服務
[root@bogon ~]# ss -tnl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 50 *:3306 *:*
LISTEN 0 128 *:111 *:*
LISTEN 0 5 192.168.122.1:53 *:*
LISTEN 0 128 *:22 *:*
LISTEN 0 128 127.0.0.1:631 *:*
LISTEN 0 100 127.0.0.1:25 *:*
LISTEN 0 128 172.16.0.155:40001 *:*
LISTEN 0 128 172.16.0.155:40002
mysqlrouter 測試實例:(由於mysqlrouter是調度到後端的,因此須要咱們在master受權用戶)
MariaDB [(none)]> grant all on *.* to 'cccc'@'172.16.0.%' identified by '111111'; Query OK, 0 rows affected (0.01 sec) [root@bogon ~]# mysql -ucccc -h172.16.0.151 -P40002 -p111111 -e 'select @@server_id;' +-------------+ | @@server_id | +-------------+ | 7 | +-------------+ [root@bogon ~]# mysql -ucccc -h172.16.0.151 -P40001 -p111111 -e 'select @@server_id;' +-------------+ | @@server_id | +-------------+ | 123 | +-------------+
四:proxysql實現讀寫分離
1.安裝proxysql
2.啓動ProxySQL服務
3.進入proxysql的管理界面
[root@bogon ~]# mysql -uadmin -padmin -h127.0.0.1 -P6032 //系統本身設定的用戶密碼,及端口號 使用main數據庫 給mysql_servers表添加監控點: insert into mysql_servers(hostgroup_id,username,port) values(10,'172.16.0.156',3306),(10,'172.16.0.150',3306),(10,'172.16.0.151',3306),(10,'172.16.0.152',3306); 在master服務器上建立監控用戶 MariaDB [(none)]> grant replication client,replication slave on *.* to 'proxyuser'@'172.16.0.%' identified by '111111'; 在proxysql上修改變量參數,設置相應的監控用戶 MySQL [main]> set mysql-monitor_username='proxyuser'; //實質上是修改了main數據中的global_variables表 MySQL [main]> set mysql-monitor_password='111111'; 在proxysql服務器上修改mysql_replication_hostgroups,爲表添加更明細的分組 MySQL [main]> insert into mysql_replication_hostgroups (writer_hostgroup,reader_hostgroup) values (10,20); 這裏必須有一個ID和以前mysql_servers表中設置的相同,至於主從,會到後端服務器配置文件中讀取read_only參數 在master服務器設置管理用戶 MariaDB [(none)]> grant all on *.* to 'root'@'172.16.0.%' identified by '111111'; MariaDB [(none)]> grant all on *.* to 'sql'@'172.16.0.%' identified by '111111'; 在proxysql也添加各個管理用戶 MySQL [main]> insert into mysql_users (username,password,default_hostgroup) values ('root','111111',10),('sql','111111',20); 這樣當使用root用戶訪問時,會訪問主服務器,使用sql時,會訪問從服務器 在proxysql上同步剛剛配置的信息,同步到運行時環境,而且同步到磁盤上 load mysql servers to runtime save mysql servers to disk load mysql variables to runtime save mysql variables to disk load mysql users to runtime save mysql users to disk 最後使用調度端口訪問mysql [root@bogon ~]# mysql -uroot -h172.16.0.154 -p111111 -P6033 -e "select @@server_id;" +-------------+ | @@server_id | +-------------+ | 123 | +-------------+ [root@bogon ~]# mysql -usql -h172.16.0.154 -p111111 -P6033 -e "select @@server_id;" +-------------+ | @@server_id | +-------------+ | 2 | +-------------+ [root@bogon ~]# mysql -usql -h172.16.0.154 -p111111 -P6033 -e "select @@server_id;" +-------------+ | @@server_id | +-------------+ | 3 | +-------------+ [root@bogon ~]# mysql -usql -h172.16.0.154 -p111111 -P6033 -e "select @@server_id;" +-------------+ | @@server_id | +-------------+ | 6 | +-------------+
注意:若主從鏈接不成功,嘗試更改防火牆策略或用戶受權