当前位置:网站首页>Implementation of MySQL master-slave architecture
Implementation of MySQL master-slave architecture
2022-06-26 16:54:00 【Comrade Xiaoqiang】
- MHA The implementation of the
1.1 Environmental preparation :
centos System server 2 platform 、 One user does Mysql master server , One for Mysql From the server , Good configuration yum Source 、 Firewall OFF 、 The clock service of each node is synchronized 、 Nodes can communicate with each other through host names
1)iptables -F && setenforce Clear firewall policy , close selinux
2) Use both servers yum Way to install Mysql service , The version is required to be consistent
3) Start two servers respectively mysql service , Make sure the service is normal
1.3.1 To configure master master server
Yes master To configure , Including opening binary logs , Assign a unique servr ID. for example , Add the following values to the configuration file [mysqld]
# open Mysql journal , The log format is binary
log-bin=/usr/local/mysql/data/binlog/mysql-bin
#[ must ] The server is unique ID, The default is 1
server-id=1
# Every write is synchronized with the hard disk
sync-binlog=1
# The name of the binary database to be synchronized
binlog-do-db=tuling
# Only keep 7 Days of binary logs , In case the disk is full of logs
expire-logs-days = 7
# Database not backed up
binlog-ignore-db=information_schema
binlog-ignore-db=performation_schema
binlog-ignore-db=sys
skip-name-resolve
// Turn off name resolution ,( Not necessary )
stay Master In the database of Backup account (user = tuling,pwd=root): Every slave standards-of-use MySQL User name and password connection master . The user who makes the copy will grant REPLICATION SLAVE jurisdiction .
# Create user MariaDB [(none)]> CREATE USER 'tuling'@'192.168.%.%' IDENTIFIED BY 'root'; # to grant authorization MariaDB [(none)]> grant replication slave,replication client on *.* to tuling@'192.168.%.%' identified by 'root'; # Refresh the permissions MariaDB [(none)]> FLUSH PRIVILEGES;
1.3.3 Check the main server status
stay Master Database execution show master status, View the binary log status and location number of the primary server .
1.3.4 To configure slave From the server
Yes slave To configure , Turn on the relay log , Assign a unique servr ID, Set read-only permissions . Add the following values to the configuration file :
server-id=2 // To configure server-id, Let the slave server have a unique ID Number
relay_log = mysql-relay-bin // open Mysql relay journal , The log format is binary
read_only = 1 // Set read-only permissions
log_bin = mysql-bin // Turn on the binary log from the server
log_slave_updates = 1 // Make the updated data written in the binary log
# If salve Library name and master The library name is the same , Use this configuration
replicate-do-db = tuling # If master Library name [tuling] And salve Library name [tuling01] Different , Use the following configuration [ You need to map ]
replicate-rewrite-db = tuling[ Main database name ] -> tuling01[ From the library name ] # If you don't want to synchronize them all [ By default, synchronize all ], Then specify the tables that need to be synchronized
replicate-wild-do-table=tuling01.t_order
replicate-wild-do-table=tuling01.t_order_item
1.3.5 Start the copy thread from the server
Give Way slave Connect master , And start doing it again master Events in binary logs .
MariaDB [(none)]> change master to master_host='192.168.241.198', [ Yours master-ip] >master_user='tuling',
>master_password='root',
>master_log_file='mysql-bin.000007', //master Corresponding bin-log file
>master_log_pos=413; //master Corresponding position
>start slave; // Start replication thread .
>SHOW SLAVE STATUS\G; // View the slave node status # Error may be reported during startup : ERROR 3021 (HY000): This operation cannot be performed with a running slave io thread;run STOP SLAVE IO_THREAD FOR CHANNEL '' first.
# terms of settlement
// When setting the synchronization relationship , It didn't stop first slaves Threads . The solution is before setting up the synchronization relationship ,
// Execute first “stop slave;”, To stop slave Threads . Then start the thread "start slave;"
1.3.6 View the status of the slave server
You can use SHOW SLAVE STATUS\G; View the status of the slave server , As shown below , Also available show processlist \G; View the current replication status :
Slave_IO_Running: Yes //IO The thread is running normally Slave_SQL_Running: Yes //SQL The thread is running normally
1) Test master-slave synchronization
We are master Create a database on the server , Then use the database to create a table , Add a record , Take a look at slave Does the server synchronize successfully .
First , Let's take a look at the databases on the two servers :
Now? , We create a database on the primary server “keer”:
then , Let's see if the slave server has been updated :
We can see that , The database has been synchronized , Next , Let's create the table , And insert a record in the table :
then , Let's see if the slave server is updated :
We set read-only on the slave server , So let's try to insert data :
This is awkward , Why do we set read-only or insert data ? How can this be solved ?
Because when we log in, we use root The super user , This big perversion is not affected by the read-only setting , therefore , We can still insert data into it , Of course , If we switch to other ordinary users, we won't have such a problem .
The solution is simple , We just need to lock the watch :
MariaDB [keer]> flush tables with read lock;
After locking the table , Let's insert another piece of data :
In this case , Even if we log in as super users , No more data can be inserted . It's a lot safer . however , There are advantages and disadvantages , In this case , Our master and slave cannot synchronize in real time , Because our master-slave synchronization is through the master-slave synchronization sql The statement is implemented by executing it again from the top , But if we lock the watch ,sql Statement cannot be executed . It is also easy to synchronize , Just unlock the table .
We insert a piece of data on the master :
here , From the top, we need to solve the table before we can realize synchronization :
1.4 Expand —— Realize one master and many slaves
When our server runs for a while , Traffic is getting more and more , At this time , The high availability and load balancing that one master and one slave can achieve cannot meet our needs , We will choose to add another slave server .
But now our master It's been running for a long time , We also need to check the new installation slave Data synchronization , Even it doesn't have master The data of .
here , There are several ways to make slave Start with another service , for example , from master Copy the data , From the other slave clone , Start with the most recent backup slave . In order to speed up slave And master Sync , Data synchronization can be carried out first in the following ways :
(1)master A snapshot of the data at some point in time ;
(3)master Binary log file of .
Next , Let's implement this process :
1.4.2 Specific implementation process
1) Yes master Make a full backup
[[email protected] ~]# mkdir /backup [[email protected] ~]# mysqldump --all-database > /backup/mysql-backup-`date +%F-%T`-all.sql
Check the binary log status and location number of the master as usual .
2) Send the fully backed up data to the newly added slave
[[email protected] ~]# scp /backup/mysql-backup-2017-11-21-10\:28\:29-all.sql @192.168.37.133:~ [email protected]'s password: mysql-backup-2017-11-21-10:28:29-all.sql 100% 504KB 503.9KB/s 00:00
3) Import this full backup into the database from :
4) Check whether the recovery from is successful :
Let's check the binary log status and location number of the slave :
Our data has been recovered successfully
The next step is to follow the above steps , Set the slave server :
[[email protected] ~]# vim /etc/my.cnf [mysqld] server-id = 3 relay-log = mysql-relay-bin read-only = 1 log-bin = mysql-bin log-slave-updates = 1
then , Let's set up the slave server :
[[email protected] ~]# mysql -uroot -p Enter password: MariaDB [(none)]> change master to master_host='192.168.37.111', >master_user='slave', >master_password='keer', >master_log_file='mysql-bin.000001', >master_log_pos=330; MariaDB [(none)]> start slave;
Then let's check the status of the slave server :
Setup complete , So let's test that out , When the master has operations , Whether to update from :
thus , We have completed one master and two slaves . If necessary , We can also continue to add slave servers .
1.5 Expand —— Realize semi synchronous replication
When the master library completes a transaction , All slave libraries execute the transaction To the client . Because you need to wait for all the transactions from the library to complete before returning , So full synchronous replication Performance is bound to be severely affected . Need a timeout .
MySQL The default copy That is, asynchronous , The main database will return the result to the client immediately after executing the transaction submitted by the client , It doesn't matter if the slave library has been received and processed , There will be a problem , Lord if crash It fell off , At this time, the submitted transactions on the master may not be transferred to the slave , If at this time , Force will come first from ascension , May result in incomplete data on the new master .
3) Semi-synchronous replication
Between asynchronous replication and full synchronous replication , The main library does not return to the client immediately after executing a transaction committed by the client , Instead, wait for at least one of the slave libraries to receive and write relay log Is returned to the client . As opposed to asynchronous replication , Semi-synchronous replication Improved data security , At the same time, it also causes a certain degree of delay , The delay is at least one TCP/IP Round-trip time . therefore , Semi synchronous replication is best used in low latency networks .
1.5.2 Realize semi synchronous replication
Semi synchronous replication is based on specific modules . But very nice One thing is , In our mariadb5.5 By default, the above versions have this module .
If our centos7 Installed on mariadb , We can go into the directory to check :
[[email protected] ~]# cd /usr/lib64/mysql/plugin/
Find our module , We can install by command , Then simply configure it to use . The following is the specific method :
MariaDB [(none)]> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; MariaDB [(none)]> SHOW GLOBAL VARIABLES LIKE 'rpl_semi%'; MariaDB [(none)]> SET GLOBAL rpl_semi_sync_master_enabled=ON;
MariaDB [(none)]> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so'; MariaDB [(none)]> SHOW GLOBAL VARIABLES LIKE 'rpl_semi%'; MariaDB [(none)]> SET GLOBAL rpl_semi_sync_slave_enabled = ON ; MariaDB [(none)]> stop slave; MariaDB [(none)]> start slave;
Now? , Our semi synchronous replication is started , We can check the log :
[[email protected] ~]# tail -200 /var/log/mariadb/mariadb.log
It can also be seen from the log that our semi synchronous replication has been started .
above , Experiment one is finished .
They are masters and followers of each other ( Double master )
Another database architecture is dual master mode , That is to say, they are master and slave to each other , This setting is not commonly used in enterprises , But we still need to master .
Master-Master Two servers to replicate , both master, It's another server slave. such , Changes made by either party , Will be applied to the other party's database through replication .
The architecture is as follows :
2.1 Environmental preparation :
centos System server 2 platform 、 Two users realize Mysql They are masters and followers of each other , Good configuration yum Source 、 Firewall OFF 、 The clock service of each node is synchronized 、 Nodes can communicate with each other through host names
1)iptables -F && setenforce Clear firewall policy , close selinux
2) Use both servers yum Way to install Mysql service , The version is required to be consistent
3) Start two servers respectively mysql service , Make sure the service is normal
2.3.1 Configure the first master master server
server-id = 1 // To configure server-id, Let the master server have a unique ID Number
log-bin = mysql-bin // open Mysql journal , The log format is binary
skip-name-resolve // Turn off name resolution ,( Not necessary )
relay_log = mysql-relay-bin // open Mysql journal , The log format is binary
read_only = 1 // Set read-only permissions
log_slave_updates = 1 // Make the updated data written in the binary log
auto_increment_offset = 1 // Indicates the number from which the growth field starts
auto_increment_increment = 2 // Represents the amount of each increment of the self growing field
2.3.2 Configure the second master master server
server-id = 2 // To configure server-id, Let the master server have a unique ID Number
log-bin = mysql-bin // open Mysql journal , The log format is binary
skip-name-resolve // Turn off name resolution ,( Not necessary )
relay_log = mysql-relay-bin // open Mysql journal , The log format is binary
read_only = 1 // Set read-only permissions
log_slave_updates = 1 // Make the updated data written in the binary log
auto_increment_offset = 2 // Indicates the number from which the growth field starts
auto_increment_increment = 2 // Represents the amount of each increment of the self growing field
Because we implement the dual master mode , So we have to create a copy account on each machine :
Let's check the status of the two servers , So as to lay a foundation for our next setting :
2.3.5 Start replication thread
Let's set up the two machines separately :
First , First, check the first one master The machine is set :
MariaDB [(none)]> change master to master_host='192.168.37.222',master_user='slave',master_password='keer',master_log_file='mysql-bin.000003',master_log_pos=245; MariaDB [(none)]> start slave;
next , Let's check his status :
Now? , Let's check the second one master Set it up :
MariaDB [(none)]> change master to master_host='192.168.37.111',master_user='slave',master_password='keer',master_log_file='mysql-bin.000002',master_log_pos=245; MariaDB [(none)]> start slave;
It can be seen that , Both of our machines are set up , Next , We can test it .
In our configuration file , We set the start value and the growth value of the self growth field , Now let's create a self - growing table :
MariaDB [keer]> create table test(id int PRIMARY KEY AUTO_INCREMENT,name char(20) not null);
Because we set up master-slave , So use this command on any machine .
After the table is created , We can insert data for testing , Let's insert multiple pieces of data to see the effect :
MariaDB [keer]> insert into test(name) value('zhao'),('qian'),('sun'),('li'); Query OK, 4 rows affected (0.00 sec) Records: 4 Duplicates: 0 Warnings: 0
MariaDB [keer]> insert into test(name) value('zhou'),('wu'),('zheng'),('wang'); Query OK, 4 rows affected (0.00 sec) Records: 4 Duplicates: 0 Warnings: 0
We have all inserted the data , Let's see how it works :
It can be seen that , The data inserted in two tables will not be duplicated .
But now it's not as continuous as we think id , This is because , Both of our machines are plugged in at the same time 4 Data , And it is not inserted synchronously , So there will be a sequence , On the first machine sql After the execution of the statement, the... On the second machine is executed . So this happens .
however , In this way, duplicate data will not be inserted . Our goal has also been achieved .
边栏推荐
- Some instance methods of mono
- proxy
- When a programmer is disturbed 10 times a day, the consequences are amazing!
- 去中心化NFT交易协议将击败OpenSea
- 【MATLAB项目实战】基于卷积神经网络与双向长短时(CNN-LSTM)融合的锂离子电池剩余使用寿命预测
- pybullet机器人仿真环境搭建 5.机器人位姿可视化
- Failed to upload hyperf framework using alicloud OSS
- Redis overview
- [force deduction question] two point search: 4 Find the median of two positive arrays
- [Li Kou brush question] monotone stack: 84 The largest rectangle in the histogram
猜你喜欢
QT 5.9.8 installation tutorial
Dialogue with the senior management of Chang'an Mazda, new products will be released in Q4, and space and intelligence will lead the Japanese system
Qt 5.9.8 安装教程
r329(MAIX-II-A(M2A)资料汇总
C语言所有知识点小结
Can Luo Yonghao succeed in entering the AR field this time?
【从删库到跑路】JDBC 完结篇(一天学完系列!!学完赶紧跑!)
数字藏品与NFT到底有何区别
Stm32h7b0 replaces the h750 program, causing the MCU to hang up and unable to burn the program
GUI+SQLServer考试系统
随机推荐
5G未平6G再启,中国引领无线通信,6G的最大优势在哪里?
Make up the weakness - Open Source im project openim about initialization / login / friend interface document introduction
MS | Xie Liwei group found that mixed probiotics and their metabolites could alleviate colitis
【从删库到跑路】JDBC 完结篇(一天学完系列!!学完赶紧跑!)
基于STM32+华为云IOT设计的云平台监控系统
Structure the graduation project of actual combat camp
What is the difference between digital collections and NFT
In a bad mood, I just write code like this
[机缘参悟-31]:鬼谷子-抵巇[xī]篇-危机是危险与机会并存
7 views on NFT market prospect
Least squares system identification class II: recursive least squares
Cloud platform monitoring system based on stm32+ Huawei cloud IOT design
Scala Basics (II): variables and data types
JS tutorial electron JS is a good tool for designing powerful multi platform desktop applications
GUI+SQLServer考试系统
[207] several possible causes of Apache crash
20:第三章:开发通行证服务:3:在程序中,打通redis服务器;(仅仅是打通redis服务器,不涉及具体的业务开发)
Web3 decentralized storage ecological landscape
[learn FPGA programming from scratch -46]: Vision - development and technological progress of integrated circuits
Teach you to learn dapr - 4 Service invocation