mysql主從同步的意思為備份,主庫(Master)將自己庫中的寫入同時同步給自己的從庫(Slave),當主庫發生某些不可預測的狀況,導致整個伺服器無法使用時,由於從庫中也有一份數據,所以數據可以做到快速恢復,不造成或減少造成數據的損失。
當master(主)函式庫的資料改變的時候,變化會即時的同步到slave(從)庫。
資料是一個應用程式至關重要的一部分。 從目的出發,主從同步有那麼點備份的意思,主庫(Master)將自己庫中的寫入同時同步給自己的從庫(Slave),當主庫發生某些不可預測的狀況,導致整個伺服器無法使用時,由於從庫中也有一份數據,所以數據可以做到快速恢復,不造成或減少造成數據的損失。
當然,這只是第一個層面,如果主從函式庫的作用僅限於此,那麼我個人認為沒有必要分成兩個資料庫,只需要定期將資料庫內容作為快照傳送到另一台伺服器,或是每次寫入時都會將寫入內容即時傳送到另一台伺服器不就好了嗎,這樣不但可以節約資源,也可以起到容災備份的目的。
當然主從同步的作用絕不會僅限於此,一旦我們配置了主從結構,我們通常不會讓從節點僅只作為備份資料庫,我們應該還會相應地配置上讀寫分離(可以使用MyCat或者其它中間件,可以自己了解一下,關於MyCat我在下一篇博客中會說這個,篇幅可能會有點長,所以就再寫一篇吧)。
在實際環境下,對於資料庫的讀取操作數目遠大於對資料庫的寫入操作,所以我們可以讓Master只提供寫的功能,然後將所有的讀取操作都移到從庫,這就是我們平常常說的讀寫分離,這樣不但可以減輕Master的壓力,還可以做災難備份,一舉兩得。
水平擴展資料庫的負載能力。
容錯,高可用。 Failover(失敗切換)/High Availability
資料備份。
說完了主從同步的概念,下面說主從同步的原理,其實原理也非常簡單,沒有Redis集群那麼多的概念。
實際上當我們在MySQL中配置了主從之後,只要我們對Master節點進行了寫入操作,這個操作將會被保存到MySQL的binary-log(bin-log)日誌當中,當slave連線到master的時候,master機器會為slave開啟binlog dump線程。當master 的 binlog發生變化的時候,Master的dump線程會通知slave,並將對應的binlog內容傳送給Slave。而Slave節點在主從同步開啟的時候,會創建兩個線程,一個I/O線程,一個SQL線程,這在我們後面的搭建中可以親眼看到。
I/0執行緒:該執行緒連結到master機器,master機器的binlog傳送到slave的時候,IO執行緒會將該日誌內容寫在本地的中繼日誌(Relay log)中。
SQL執行緒:此執行緒讀取中繼日誌中的內容,並且根據中繼日誌中的內容對Slave資料庫做對應的操作。
可能造成的問題:在寫入請求相當多的情況下,可能會造成Slave資料和Master資料不一致的情況,這是因為日誌傳輸過程中的短暫延遲、或寫入指令較多,系統速度不符造成的。
這大致上是MySQL主從同步的原理,真正在其中發揮作用的實際上就是這兩個日誌文件,binlog和中繼日誌。
本次搭建主從同步的環境:CentOS 7 ,MySQL 8.0. 18(使用二進位套件安裝)。
這次將會搭建MySQL的主從同步,其中一台Master,兩台Slave。
Master:IP :192.168.43.201 Port:3306 Slave1:IP:192.168.43.202 Port:3306 Slave2:IP:192.168.43.203 Port:3306
修改設定檔
當我們安裝好MySQL之後,在/etc/目錄下會有一個my.cnf文件,開啟文件,加入如下內容(別忘了修改之前做好備份):
x
#该配置为Master的配置 server-id=201 #Server id 每台MySQL的必须不同 log-bin=/var/lib/mysql/mysql-bin.log #代表开启binlog日志 expire_logs_days=10 #日志过期时间 max_binlog_size=200M #日志最大容量 binlog_ignore_db=mysql #忽略mysql库,表示不同步此库
y
#该配置为Slave的配置,第二台Slave也是这么配置,不过要修改一下server-id server-id=202 expire_logs_days=10 #日志的缓存时间 max_binlog_size=200M #日志的最大大小 replicate_ignore_db=mysql #忽略同步的数据库
新增Slave使用者
開啟Master節點的客戶端, mysql -u root -p 密碼
建立使用者 create user 'Slave'@'%' identified by '123456';
#給予新建立的使用者賦權: grant replication slave on '*.*' to 'Slave'@'%';
查看Master節點狀態
以上操作都沒有問題後,我們在客戶端中輸入show master status查看master的binlog日誌。
配置两个Slave节点
打开两个Slave节点客户端,在我们的另外两个Slave节点中输入如下命令:
change master to master_user='Slave',master_password='123456',master_host='192.168.43.201',master_log_file='mysql-bin.000005',master_log_pos=155,get_master_public_key=1; #注意,这里的master_log_file,就是binlog的文件名,输入上图中的mysql-bin.000005,每个人的都可能不一样。 #注意,这里的master_log_pos是binlog偏移量,输入上图中的155,每个人的都可能不一样。
配置完成后,输入start slave;开启从节点,然后输入show slave status\G;查看从节点状态
可以看到,在两台Slave的状态中,我们能亲眼看到IO线程和SQL线程的运行状态,这两个线程必须都是yes,才算配置搭建完成。
通过上述步骤,就完成了MySQL主从同步的搭建,相对Redis而言MySQL配置相当简单。下面我们可以进行测试。
先看看三个MySQL的数据库状态:SHOW DATABASES;
可以看到现在数据库都是初始默认状态,没有任何额外的库。
在Master节点中创建一个数据库,库名可以自己设置。
CREATE DATABASE testcluster;
<img alt="" class="has" src="https://img.php.cn/upload/article/000/000/024/fefa55750f9a4ddaec29168c6cc022e9-4.png">
可以看到,在Slave中也出现了Master中创建的数据库,说明我们的配置没有问题,主从搭建成功。这里就不再创建表了,大家可以自己试试,创建表再往表中插入数据,也是没有任何问题的。
如果出现IO线程一直在Connecting状态,可以看看是不是三台机器无法相互连接,如果可以相互连接,那么有可能是Slave账号密码写错了,重新关闭Slave然后输入上面的配置命令再打开Slave即可。
如果出现SQL线程为NO状态,那么有可能是从数据库和主数据库的数据不一致造成的,或者事务回滚,如果是后者,先关闭Slave,然后先查看master的binlog和position,然后输入配置命令,再输入set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
,再重新start slave;
即可,如通过是前者,那么就排查一下是不是存在哪张表没有被同步,是否存在主库存在而从库不存在的表,自己同步一下再重新配置一遍即可。
在写这篇文章之前自己也被一些计算机领域的“名词”吓到过,相信有不少同学都有一样的体会,碰上某些高大上的名词总是先被吓到,例如像“分布式”、“集群”等等等等,甚至在没接触过nginx之前,连”负载均衡“、”反向代理“这样的词都让人觉得,这么高达上的词,肯定很难吧,但其实自己了解了nginx、ribbon等之后才发现,其实也就那么回事吧,没有想象中的那么难。
所以写这篇文章的初衷是想让大家对集群化或者分布式或者其他的一些技术或者解决方案不要有一种望而却步的感觉(感觉计算机领域的词都有这么一种特点,词汇高大上,但是其实思想是比较好理解的),其实自己手动配置出一个简单的集群并没有那么难。
如果学会docker之后再来配置就更加简单了,但是更希望不要只局限于会配置,配置出来的东西只能说你会配置了,但是在这层配置底下是前人做了相当多的工作,才能使我们通过简单配置就能实现一些功能,应该要深入底层,了解配置下面的工作原理,这个才是最重要的,也是体现一个程序员水平的地方。
推荐教程:mysql视频教程
以上是mysql主從同步是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!