MySQL的主從、半主從、主主複製配置詳細
實驗拓撲圖模型:
############################【實驗MySQL服務器的主從複製:】#######################################
###########################修改主配置文件########################################## [root@director2 ~ ]#vim /etc/mysql/my.cnf [mysqld] 42 thread_concurrency= 8 43 innodb_file_per_table = on 44 datadir = /mydata ###############庫目錄 45 skip_name_resolve = on ###############不反解主機名 59 log-bin=mysql-bin ###############啓用二進制日誌 67 server-id = 1 ###############唯一ID
[root@director2 ~ ]# chkconfig --list mysqld #####保證mysqld的開啓自啓動 mysqld 0:off 1:off 2:on 3:on 4:on 5:on 6:off
############################授權一個有複製權限的用戶##############################################
mysql> grant replication client,replication slave on *.* to 'cpuser'@'172.16.249.106' identified by "magedu"; Query OK, 0 rows affected (0.08 sec) mysql> flush privileges; Query OK, 0 rows affected (0.01 sec)
###########################從節點準備#############################################################
[root@node2 ~ ]# groupadd -g 306 mysql [root@node2 ~ ]# useradd -g 306 -u 306 mysql [root@node2 ~ ]# mkdir /mydata [root@node2 ~ ]# cd /mydata/ [root@node2 / ]# chown -R mysql:mysql /mydata/ [root@node2 / ]# chmod -R a+w /mydata/
###################主節點:把mysql文件傳輸給主節點################################################
[root@node2 mysql ]#id mysql uid=306(mysql) gid=306(mysql) groups=306(mysql) [root@node2 mysql ]#ll /mydata total 0 [root@node2 mysql ]#ll -d /mydata drwxrwxrwx 2 mysql mysql 4096 Jan 23 11:03 /mydata [root@node2 mysql ]#mkdir /etc/mysql [root@node2 mysql ]# scripts/mysql_install_db --user=mysql --datadir=/mydata ###初始化 [root@director2 ~ ]# scp /etc/mysql/my.cnf 172.16.249.106:/etc/mysql/ ###把主節點的配置文件拷貝過來 [root@node2 / ]# vim /etc/mysql/my.cnf ####編輯從節點的配置文件 59 #log-bin=mysql-bin ####從節點不啓用二禁止日誌 67 server-id = 20 ####server-id保持唯一 68 relay-log = relay-bin ####從節點開啓中繼日誌 69 read-only =on ####只讀模式開啓(注意:這個只能限制普通用戶)
方法二:此處也可以直接施加讀鎖。在mysql> lock tables testdb read;
mysql> show variables like 'relay%'; #####中繼日誌開啓了 +-----------------------+--------------------+ | Variable_name | Value | +-----------------------+--------------------+ | relay_log | relay-bin | | relay_log_index | | | relay_log_info_file | relay-log.info | | relay_log_purge | ON | | relay_log_recovery | OFF | | relay_log_space_limit | 0 | +-----------------------+--------------------+ mysql> show variables like "read%"; #############只讀模式開啓 +----------------------+---------------------+ | Variable_name | Value | +----------------------+---------------------+ | read_buffer_size | 1048576 | | read_only | ON | | read_rnd_buffer_size | 4194304 | +----------------------+---------------------+
#############################至此主從各單個節點配置結束########################################
#############################配置從連接主#######################################################
#####主節點查看二進制文件的存儲位置
mysql> show master status; +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | | +------------------+----------+--------------+------------------+ | mysql-bin.000003 | 501 | | | +------------------+----------+--------------+------------------+ 1 row in set (0.04 sec) ######################################建立主從連接####################################### mysql> change master to master_host='172.16.249.122',master_user='cpuser',master_password='magedu',master_log_file='mysql-bin.000003',master_log_pos=501;
mysql> show slave status\G; #####查看當前從節點狀態 ***************************1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host:172.16.249.122 Master_User: cpuser Master_Port: 3306 Connect_Retry: 60 Master_Log_File:mysql-bin.000003 Read_Master_Log_Pos:501 Relay_Log_File: relay-bin.000002 Relay_Log_Pos: 529 Relay_Master_Log_File: mysql-bin.000003 Slave_IO_Running: Yes ###IO線程啓用 Slave_SQL_Running: Yes ###SQL線程已經啓用
#############################################測試結果##############################################
######主節點創建庫
mysql> create database testdb; Query OK, 1 row affected (0.03 sec) mysql> use testdb; Database changed
此時從節點已經同步了:
############################################創建一個表############################################
mysql> create table students(id tinyint unsigned not null auto_increment unique key); Query OK, 0 rows affected (0.25 sec)
總結步驟:::
【主服務器】
1,主服務器的server-id,保持唯一。
2,開啓二進制日誌。
3,授權一個可以複製的用戶,最小權限使用,指向從服務器最好。
【從服務器】
1,關閉二進制日誌,開啓中繼日誌
2,保持唯一的server-id
3,爲了防止從服務器寫入數據,開啓只讀模式。
4,連接主服務器,指定主服務器Ip,授權的用戶,密碼,上一次的二進制文件的位置。
5,開啓IO,SQL線程。
########################################【半主從模式】########################################
##############此處的半主從是在主從的基礎上的半同步:
1,條件是有一個從服務器,他和主服務器同樣的寫同步,如果同步超時,把這個從這個從節點降級爲異步。恢復正常的狀態。
【完成半同步,需要的是步驟是各自的插件】
[root@node2 plugin]# pwd /usr/local/mysql/lib/plugin [root@node2 plugin ]# semisync_master.so(主節點的插件) semisync_slave.so (從節點的插)
主節點:安裝插件
此時全局參數變多了
mysql> install plugin rpl_semi_sync_master soname 'semisync_master.so'; Query OK, 0 rows affected (0.15 sec) mysql> show global variables like '%semi%'; #####安裝好了之後,生成很多變量 +------------------------------------+---------------------+ | Variable_name | Value | +------------------------------------+---------------------+ | rpl_semi_sync_master_enabled | OFF | 表示雖然安裝,但是沒有啓用 | rpl_semi_sync_master_timeout | 10000 | ###探測主的超時時長 | rpl_semi_sync_master_trace_level | 32 | ####追蹤級別 | rpl_semi_sync_master_wait_no_slave | ON | ####等待從服務器的上線的時間 +------------------------------------+---------------------+ mysql> set global rpl_semi_sync_master_enabled=1; #####啓用這個插件 Query OK, 0 rows affected (0.00 sec) mysql> set global rpl_semi_sync_master_timeout=2000; Query OK, 0 rows affected (0.00 sec)
【從節點安裝插件配置】
mysql> install plugin rpl_semi_sync_slave soname 'semisync_slave.so'; Query OK, 0 rows affected (0.10 sec) mysql> show global variables like '%semi%'; +---------------------------------+-------------------+ |Variable_name | Value | +---------------------------------+-------------------+ | rpl_semi_sync_slave_enabled | OFF | ###插件未啓用 | rpl_semi_sync_slave_trace_level | 32 | +---------------------------------+-------------------+ mysql> set global rpl_semi_sync_slave_enabled=1; ####啓用插件 Query OK, 0 rows affected (0.00 sec)
###############################至此兩個節點的插件全部安裝,啓用完畢###############################
mysql> show global status like '%semi%'; +--------------------------------------------+-----------------------------+ |Variable_name | Value | +--------------------------------------------+-----------------------------+ | Rpl_semi_sync_master_clients | 0 | | Rpl_semi_sync_master_net_avg_wait_time | 0 | | Rpl_semi_sync_master_net_wait_time | 0 | | Rpl_semi_sync_master_net_waits | 0 | | Rpl_semi_sync_master_no_times | 0 | | Rpl_semi_sync_master_no_tx | 0 | | Rpl_semi_sync_master_status | ON | | Rpl_semi_sync_master_timefunc_failures | 0 | | Rpl_semi_sync_master_tx_avg_wait_time | 0 | | Rpl_semi_sync_master_tx_wait_time | 0 | | Rpl_semi_sync_master_tx_waits | 0 | | Rpl_semi_sync_master_wait_pos_backtraverse | 0 | | Rpl_semi_sync_master_wait_sessions | 0 | | Rpl_semi_sync_master_yes_tx | 0 | +--------------------------------------------+-----------------------------+ mysql> stop slave IO_THREAD; Query OK, 0 rows affected (0.00 sec) mysql> start slave IO_THREAD; Query OK, 0 rows affected (0.00 sec)
再次查看已經啓用了。下面直接測試使用即可######
##################################【實驗二雙主模式的實現】######################################
#################還是用的之前兩臺主機,重新初始化重新配置
1,雙節點各自使用不同的server id
2, 都啓用binlog 和relay log
3,自動自動增長的id字段的增長特殊定義:
3, 都授權有複製權限的用戶賬號
修改節點一的配置文件
節點一:配置文件
[root@director2 ~ ]#vim .my.cnf 59 log-bin=mysql-bin ####開啓二進制日誌 67 server-id = 10 ####服務器唯一ID 68 relay-log=relay-bin ####開啓中繼日誌,因爲互爲主從 69 auto_increment_offset=1 ####指定日誌的初始偏移量 70 auto_increment_increment=2 ####每次的偏移步長 [root@director2 bin ]# mysql mysql> grant replication slave,replication client on *.* to 'cpuser'@'%' identified by 'magedu';Query OK, 0 rows affected (0.04 sec) ####給節點授權一個可鏈接用戶 mysql> flush privileges; mysql> show master status; +------------------+----------+--------------+------------------------------------+ |File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------------------------+ |mysql-bin.000003 | 1796 | | | +------------------+----------+--------------+------------------------------------+ mysql> change master to master_host='172.16.249.106',master_user='cpuser',master_password='magedu',master_log_file='mysql-bin.000001',master_log_pos=493; Query OK, 0 rows affected (0.10 sec) mysql> start slave;
【節點二的配置文件】
59 log-bin=mysql-bin ####開啓二進制日誌 67 server-id = 20 ####區別節點一的ID 68 relay-log = relay-bin ####開啓中繼日誌(也有從的角色) 69 auto-increment_offset =2 ####自增其實位置 70 auto-increment_increment=2 ####自增的步長 [root@node2 mysql ]# mysql mysql> grant replication slave,replication client on *.* to 'cpuser'@'%' identified by'magedu'; mysql> flush privileges; mysql> change master to mysql> show master status; +------------------+----------+--------------+-------------------------------+ |File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+-------------------------------+ |mysql-bin.000001 | 493 | | | +------------------+----------+--------------+-------------------------------+ master_host='172.16.249.122',master_user='cpuser',master_password='magedu',master_log_file='mysql-bin.000003',master_log_pos=1796; Query OK, 0 rows affected (0.07 sec) mysql> start slave;
##################節點一創建數據庫tb1
##################節點二可以立即同步
##################節點二:在這個庫裏面創建表
##################並且插入數據1
##################節點一,已經同步
至此雙主模式模式也實現完畢!!!!!!!!!!!!!