mysql 兩主一從環境搭建(5.7.24)

itread01 2020-11-06 20:33:58
Mysql 搭建 数据库/缓存 itread01 5.7.24


## 搭建說明 * 兩主一從,從本質上說,只不過是機器 master-a 和 master-b 互為主從機(熱備),然後通過 **keepalived** 進行高可用配置,使得在同一時間內只會有一臺對外提供服務,實現單寫機制,另一個機器 slave 則作為 master-a 的從機存在(冷備)。 * 從機 slave 無法直接將虛擬IP(VIP)作為主機:正常執行時,slave 綁定了一個主機 master-a, 一旦繫結之後,在 master-a 不可用的時候,無法自動切換到 master-b,因為需要考慮 二進位制日誌檔名(master_log_file)及位置(master_log_pos)在 master-a 和 master-b 上是不一致的,此時只有在 master-a 恢復可用時,master-a 從 master-b 同步資料之後,slave 資料最終才會和 master-a 保持一致。 ## 環境準備 1. 三臺 centos7 的伺服器,伺服器ip為 192.168.86.124(master-a)、192.168.86.125(master-b)、192.168.86.126(slave) 2. 一個虛擬IP(VIP):192.168.86.250 3. [mysql-5.7.24-linux-glibc2.12-x86_64 安裝包](https://downloads.mysql.com/archives/community/) ## 資料庫安裝 1. 將 mysql 安裝包上傳到三臺伺服器上 2. 解壓安裝包 ``` tar -zxvf mysql-5.7.24-linux-glibc2.12-x86_64.tar.gz ``` 3. 建立 mysql 安裝路徑,然後移動剛才解壓的資料夾並重命名 ``` mkdir /data #建立安裝路徑 mv mysql-5.7.24-linux-glibc2.12-x86_64 /data/mysql #移動檔案並重命名 ``` 4. 建立 mysql 使用者和組、建立mysql執行需要的資料夾及賦權 ``` groupadd mysql #建立使用者組 useradd -r -g mysql mysql #建立使用者 cd /data/mysql #切換到安裝目錄 mkdir data #建立資料存放目錄 mkdir mysql-log #建立日誌存放目錄 mkdir mysql-log/err-log mkdir mysql-log/slow-log mkdir mysql-log/relay-log mkdir mysql-log/bin-log chown -R root:mysql . #將當前目錄以及子目錄,所有者改變為 mysql,所屬組修改為 mysql chown -R mysql:mysql data chown -R mysql:mysql mysql-log ``` 5. 設定使用者作業系統資源限制 ``` vi /etc/security/limits.conf # 在檔案中加入以下內容 mysql soft nproc 2047 mysql hard nproc 16384 mysql soft nofile 1024 mysql hard nofile 65536 ``` 6. 設定連結和服務 ``` cp /data/mysql/support-files/mysql.server /etc/init.d/mysql # 可以使用service mysql start ln -s /data/mysql/bin/mysql /usr/bin #任何路徑可以使用 mysql 命令 ``` 7. 配置 /etc/my.cnf ``` vi /etc/my.cnf ``` * master-a ``` [mysqld] port = 3306 #埠 basedir = /data/mysql #mysql安裝路徑 datadir = /data/mysql/data/ #mysql資料存放路徑 #日誌設定 log-error = /data/mysql/mysql-log/err-log/db-err.log #錯誤日誌路徑 slow-query-log-file = /data/mysql/mysql-log/slow-log/db-slow.log #慢SQL日誌路徑 relay-log=/data/mysql/mysql-log/relay-log/relay-log long-query-time = 20 #怎樣才算是慢sql,單位是秒 #開啟 binlog 同步 server_id = 0001 #一個叢集內的 MySQL 伺服器 ID,全域性唯一 log-bin = /data/mysql/mysql-log/bin-log/db-binlog #開啟 Binlog 並寫明存放日誌的位置 max-binlog-cache_size = 64M #binlog 最大能夠使用cache的記憶體大小 max-binlog-size = 1G #binlog 日誌每達到設定大小後,會使用新的 binlog 日誌 expire_logs_days = 15 #只保留最近15天的bin日誌 binlog-format = mixed #混合模式複製 innodb_flush_log_at_trx_commit = 1 #和 sync_binlog 控制MySQL磁碟寫入策略以及資料安全性 sync-binlog = 1 #控制資料庫的binlog刷到磁碟上去 ## 主主同步配置 replicate-do-db=db_test #需要從主庫-2同步的資料庫1 replicate-do-db=db_dev #需要從主庫-2同步的資料庫2 auto-increment-increment=2 auto-increment-offset=1 log-slave-updates=1 #效能調優配置 innodb_buffer_pool_size = 24576M max_connections = 5000 max_connect_errors = 6000 external-locking = FALSE max_allowed_packet = 64M join_buffer_size = 64M sort_buffer_size = 2M read_rnd_buffer_size = 16M #SQL模式 sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES ``` * master-b ``` [mysqld] port = 3306 basedir = /data/mysql datadir = /data/mysql/data #日誌設定 slow-query-log-file=/data/mysql/mysql-log/slow-log/db-slow.log log-error=/data/mysql/mysql-log/err-log/db-err.log relay-log=/data/mysql/mysql-log/relay-log/relay-log long-query-time = 20 #怎樣才算是慢sql,單位是秒 #開啟 binlog 同步 server_id = 0002 #一個叢集內的 MySQL 伺服器 ID,全域性唯一 log-bin = /data/mysql/mysql-log/bin-log/db-binlog #開啟 Binlog 並寫明存放日誌的位置 max-binlog-cache_size = 64M #binlog 最大能夠使用cache的記憶體大小 max-binlog-size = 1G #binlog 日誌每達到設定大小後,會使用新的 binlog 日誌 expire_logs_days = 15 #只保留最近15天的日誌 binlog-format = mixed #混合模式複製 innodb_flush_log_at_trx_commit = 1 #和 sync_binlog 控制MySQL磁碟寫入策略以及資料安全性 sync-binlog = 1 #控制資料庫的binlog刷到磁碟上去 #主主設定 replicate-do-db=db_test #需要從主庫-1同步的資料庫1 replicate-do-db=db_dev #需要從主庫-1同步的資料庫2 auto-increment-increment=2 auto-increment-offset=2 log-slave-updates=1 #效能調優設定 innodb_buffer_pool_size = 24576M max_connections = 5000 max_connect_errors = 6000 external-locking = FALSE max_allowed_packet = 64M join_buffer_size = 64M sort_buffer_size = 2M read_rnd_buffer_size = 16M #SQL模式 sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES ``` * slave ``` [mysqld] port = 3306 basedir = /data/mysql datadir = /data/mysql/data #日誌設定 expire_logs_days = 15 long-query-time = 3 slow-query-log-file=/data/mysql/mysql-log/slow-log/db-slow.log log-error=/data/mysql/mysql-log/err-log/db-err.log #主從設定 server_id = 0003 #這裡需要在叢集中保持唯一 replicate-do-db=db_test #需要從主庫同步的資料庫1 replicate-do-db=db_dev #需要從主庫同步的資料庫2 read_only=1 #只讀設定 #效能調優設定 innodb_buffer_pool_size = 24576M max_connections = 5000 max_connect_errors = 6000 external-locking = FALSE max_allowed_packet = 64M join_buffer_size = 64M sort_buffer_size = 2M read_rnd_buffer_size = 16M #SQL模式 sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES ``` ## 資料庫初始化 1. 初始化資料庫 ``` cd /data/mysql/bin/ ./mysqld --defaults-file=/etc/my.cnf --user=mysql --initialize #初始化 ``` 2. 檢視密碼(初始化資料庫之後會生成一個 root 賬戶的預設密碼) ``` cat /data/mysql/mysql-log/err-log/db-err.log ``` 3. 啟動 mysql ``` service mysql start ``` 4. 登入並修改 root 密碼 ``` mysql -u root -p set password = password('root'); flush privileges; #如果需要使用 root 進行遠端連線,執行以下語句 use mysql; update user set host = '%' where user = 'root'; flush privileges; ``` 5. 建立使用者並賦權 * 主機 master-a、master-b ``` #建立一個用於和從機“通訊”的使用者,具有同步許可權 grant replication slave on *.* to 'copy'@'%' identified by 'copy' flush privileges; #建立一個用於訪問和操作某些特定的庫的使用者,不應該讓應用直接使用 root 使用者. grant all privileges on db_test.* to "app_user"@'%' identified by "app_user"; flush privileges; ``` * 從機 slave ``` #建立一個用於訪問和操作某些特定的庫的使用者,不應該讓應用直接使用 root 使用者. grant all privileges on db_test.* to "app_user"@'%' identified by "app_user"; flush privileges; ``` ## 主從同步啟動 1. 主機 master-a 1. 在 master-b 中獲得二進位制日誌檔名(master_log_file)及位置(master_log_pos) ``` show master status ``` ![image](https://images.cnblogs.com/cnblogs_com/shulipeng/1877135/o_2011060717111588349415(1).png) 2. 在 master-a 中執行以下命令 ``` stop slave; #暫停 reset slave; #重置 change master to master_host="master-b 的IP", master_user="copy",master_password="copy",master_log_file="db-binlog.000002",master_log_pos=2532; #設定和主機同步的使用者資訊,日誌檔案資訊 start slave; #啟動 show slave status \G #檢視從機狀態,主要是看 Slave_IO_Running Slave_SQL_Running 上是否都是 yes ``` ![image](https://images.cnblogs.com/cnblogs_com/shulipeng/1877135/o_2011060717201588349665(1).png) 2. 主機 master-b、從機 slave 1. 在 master-a 中獲得二進位制日誌檔名(master_log_file)及位置(master_log_pos) ``` show master status ``` 2. 在 master-b和 slave 中執行以下命令 ``` stop slave; #暫停 reset slave; #重置 change master to master_host="master-a 的IP", master_user="copy",master_password="copy",master_log_file="db-binlog.000002",master_log_pos=2532; #設定和主機同步的使用者資訊,日誌檔案資訊 start slave; #啟動 show slave status \G #檢視從機狀態,主要是看 Slave_IO_Running Slave_SQL_Running 上是否都是 yes ``` ## keepalived 安裝啟動(master-a、master-b) 1. keepalived 安裝 ``` yum install -y keepalived ``` 2. keepalived 配置 ``` vi /etc/keepalived/keepalived.conf ``` 檔案內容為: ``` global_defs { router_id LVS_DEVEL } vrrp_sync_group VG_1 { group { VI_1 } } vrrp_instance VI_1 { state BACKUP #兩個機器都是這個值,不要設定為 MASTER,使用下面的 priority 來控制 interface ens33 #通過 ifconfig 檢視 virtual_router_id 51 priority 100 #優先順序,另一臺機器設定為 90 advert_int 1 nopreempt # 另一臺優先順序低的機器不設定此引數! authentication { auth_type root auth_pass root } virtual_ipaddress { 192.168.86.250 # 這個是VIP } } virtual_server 192.168.86.250 3306 { # 這個是VIP delay_loop 2 lb_algo rr lb_kind DR persistence_timeout 50 protocol TCP real_server 192.168.86.124 3306 { # 這是機器的IP地址 weight 3 notify_down /data/mysql/bin/mysql.sh TCP_CHECK { connect_timeout 5 nb_get_retry 3 delay_before_retry 3 connect_port 3306 } } } ``` 3. 建立一個關閉 keepalived 的指令碼,用於在 mysql 無法訪問時,關閉 keepalived 以釋放 VIP ``` vi /data/mysql/bin/mysql.sh ``` 檔案內容為: ``` #!/bin/sh pkill keepalived ``` 將檔案設定為可執行檔案: ``` chmod +x /data/mysql/bin/mysql.sh ``` 4. keepalived 啟動 ``` systemctl start keepalived ``` 5. keepalived 其它相關命令 ``` systemctl enable keepalived # 開機自啟動 systemctl start keepalived # 啟動 systemctl stop keepalived # 暫停 systemctl restart keepalived # 重啟 systemctl status keepalived # 檢視狀態 tail -f /var/log/messages ``` ## 測試 1. 首先,所有機器、軟體都正常執行 * 通過各個 IP和VIP 連線資料庫檢視均能正常連線到資料庫 ![image](https://images.cnblogs.com/cnblogs_com/shulipeng/1877135/o_201106071105110614430417_01604632406(1).png?a=1604647194590) * master-a 獲得了 vip ``` ip addr ``` ![image](https://images.cnblogs.com/cnblogs_com/shulipeng/1877135/o_2011060717281026616-20201106105155900-1945251753.png?a=1604647194590) 2. 通過 VIP 連線資料庫,之後建立一個 db_test 庫以及 tb_user表 * master-a、master-b、slave 均存在建立的庫和表 3. 連線 master-a 的資料庫,並新增一條資料 * master-b、slave 均有新增的資料 4. 連線 master-b 的資料庫,並新增一條資料 * master-a、slave 均有新增的資料 5. 關閉 master-a 的mysql ``` service mysql stop #關閉 mysql systemctl status keepalived #檢視 keepalived 狀態 ``` * master-a 的 keepalived 自動關閉了,原因是 mysql 關閉會觸發 keepalived 配置的 notify_down 指令碼 * master-b 獲得了 vip 6. 通過 VIP 連線資料庫,並插入一條資料 * master-a(無法連線) * master-b (存在新增資料) * slave(不存在新增資料,因為 master-a 掛掉了) 7. 重啟 master-a 的 mysql 和 keepalived * vip 仍然在 master-b ,因為 master-a keepalived 配置了非搶佔模式 **nopreempt**,因此若是主機故障排除後需要將主機的keepalived重啟,然後重啟從機的keepalived,需要讓主機獲取到 VIP * master-a、master-b 同步了剛剛新增的資料 8. 關閉 master-b、slave 的mysql,通過 master-a 新增一條資料,之後重啟 master-b、slave 的 mysql,以及 master-b 的 keepalived * master-b存在新增資料 * slave 存在新增資料 * vip 仍然在 master-a ## 常
版权声明
本文为[itread01]所创,转载请带上原文链接,感谢
https://www.itread01.com/content/1604665805.html

  1. 【计算机网络 12(1),尚学堂马士兵Java视频教程
  2. 【程序猿历程,史上最全的Java面试题集锦在这里
  3. 【程序猿历程(1),Javaweb视频教程百度云
  4. Notes on MySQL 45 lectures (1-7)
  5. [computer network 12 (1), Shang Xuetang Ma soldier java video tutorial
  6. The most complete collection of Java interview questions in history is here
  7. [process of program ape (1), JavaWeb video tutorial, baidu cloud
  8. Notes on MySQL 45 lectures (1-7)
  9. 精进 Spring Boot 03:Spring Boot 的配置文件和配置管理,以及用三种方式读取配置文件
  10. Refined spring boot 03: spring boot configuration files and configuration management, and reading configuration files in three ways
  11. 精进 Spring Boot 03:Spring Boot 的配置文件和配置管理,以及用三种方式读取配置文件
  12. Refined spring boot 03: spring boot configuration files and configuration management, and reading configuration files in three ways
  13. 【递归,Java传智播客笔记
  14. [recursion, Java intelligence podcast notes
  15. [adhere to painting for 386 days] the beginning of spring of 24 solar terms
  16. K8S系列第八篇(Service、EndPoints以及高可用kubeadm部署)
  17. K8s Series Part 8 (service, endpoints and high availability kubeadm deployment)
  18. 【重识 HTML (3),350道Java面试真题分享
  19. 【重识 HTML (2),Java并发编程必会的多线程你竟然还不会
  20. 【重识 HTML (1),二本Java小菜鸟4面字节跳动被秒成渣渣
  21. [re recognize HTML (3) and share 350 real Java interview questions
  22. [re recognize HTML (2). Multithreading is a must for Java Concurrent Programming. How dare you not
  23. [re recognize HTML (1), two Java rookies' 4-sided bytes beat and become slag in seconds
  24. 造轮子系列之RPC 1:如何从零开始开发RPC框架
  25. RPC 1: how to develop RPC framework from scratch
  26. 造轮子系列之RPC 1:如何从零开始开发RPC框架
  27. RPC 1: how to develop RPC framework from scratch
  28. 一次性捋清楚吧,对乱糟糟的,Spring事务扩展机制
  29. 一文彻底弄懂如何选择抽象类还是接口,连续四年百度Java岗必问面试题
  30. Redis常用命令
  31. 一双拖鞋引发的血案,狂神说Java系列笔记
  32. 一、mysql基础安装
  33. 一位程序员的独白:尽管我一生坎坷,Java框架面试基础
  34. Clear it all at once. For the messy, spring transaction extension mechanism
  35. A thorough understanding of how to choose abstract classes or interfaces, baidu Java post must ask interview questions for four consecutive years
  36. Redis common commands
  37. A pair of slippers triggered the murder, crazy God said java series notes
  38. 1、 MySQL basic installation
  39. Monologue of a programmer: despite my ups and downs in my life, Java framework is the foundation of interview
  40. 【大厂面试】三面三问Spring循环依赖,请一定要把这篇看完(建议收藏)
  41. 一线互联网企业中,springboot入门项目
  42. 一篇文带你入门SSM框架Spring开发,帮你快速拿Offer
  43. 【面试资料】Java全集、微服务、大数据、数据结构与算法、机器学习知识最全总结,283页pdf
  44. 【leetcode刷题】24.数组中重复的数字——Java版
  45. 【leetcode刷题】23.对称二叉树——Java版
  46. 【leetcode刷题】22.二叉树的中序遍历——Java版
  47. 【leetcode刷题】21.三数之和——Java版
  48. 【leetcode刷题】20.最长回文子串——Java版
  49. 【leetcode刷题】19.回文链表——Java版
  50. 【leetcode刷题】18.反转链表——Java版
  51. 【leetcode刷题】17.相交链表——Java&python版
  52. 【leetcode刷题】16.环形链表——Java版
  53. 【leetcode刷题】15.汉明距离——Java版
  54. 【leetcode刷题】14.找到所有数组中消失的数字——Java版
  55. 【leetcode刷题】13.比特位计数——Java版
  56. oracle控制用户权限命令
  57. 三年Java开发,继阿里,鲁班二期Java架构师
  58. Oracle必须要启动的服务
  59. 万字长文!深入剖析HashMap,Java基础笔试题大全带答案
  60. 一问Kafka就心慌?我却凭着这份,图灵学院vip课程百度云