Mysql集群之mysql双主双活教程 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651
  1. 第一种是keepalived方式
  2. 第二种是nginx方式
  3. 一、介绍
  4. MySQL双主双活是指两台mysql服务器mysql-1、mysql-2都为master主节点服务器,同时又是对方的slave从节点,每个数据库都可作为主数据库使用,并将对数据库操作的数据同步至另外一台mysql服务中。
  5. 当应用服务开发过程中使用了mysql-1连接信息,在打包发布后,数据库连接信息已经固定,当数据库mysql-1出现异常时,需要人工干预先将应用服务停止-->将应用服务的mysql连接信息改为mysql-2 -->在启动应用服务器,比较繁琐,当应用服务器较多时,一个一个关闭,修改,再重启,将耽误更多时间,应用服务器修复故障时间延长,严重时会造成灾难性的后果。
  6. 故而引入了keepalived,keepalived通过VIP虚拟IP的漂移实现高可用,在相同集群内发送组播包,master主通过VRRP协议发送组播包,告诉从主的状态。
  7. 当我们通过keepalived虚拟出一个ip服务 mysql-3,应用服务只需要将mysql配置信息更改为mysql-3的配置信息,mysql-3实际代理的实体服务器为mysql-1或mysql-2。
  8. 例如:当mysql-3实际代理mysql-1时,mysql-1服务出现故障后,keepalived通过自身机制,自动将mysql-2作为实际代理主服务器,不需要人工干预去修改mysql配置信息,从而实现了高可用。
  9. 二、准备工作
  10. 1.两台centos7 linux服务器
  11. mysql-1:192.168.222.128
  12. mysql-2:192.168.222.129
  13. 2.mysql安装包
  14. 版本:mysql-5.7.36-el7-x86_64.tar.gz
  15. 下载地址:https://cdn.mysql.com/archives/mysql-5.7/mysql-test-5.7.36-el7-x86_64.tar.gz
  16. 3.keepalived安装包
  17. 版本:keepalived-2.2.7.tar.gz
  18. 下载地址:https://www.keepalived.org/software/keepalived-2.2.7.tar.gz
  19. 三、安装mysql
  20. 1.在128、129两台服务器根据《linux安装mysql服务-两种安装方式教程》安装好mysql应用。
  21. 2.修改128服务器/etc/my.cnf配置文件,没有的话可自行创建,配置如下:
  22. 两个数据库数据要一致
  23. 整库备份:/data/mysql-5.7.37/bin/mysqldump -uroot -p -h172.16.66.142 --all-databases > /data/mysql_backup/usky.sql
  24. 单库备份:/data/mysql-5.7.37/bin/mysqldump -uusky_admin -p'Usky@2024!@#$_' -h172.16.66.142 usky-cloud > /2025-03-21/usky-cloud.sql
  25. 整库还原:mysql -u root -p < usky.sql
  26. 单库还原:mysql -u root -p usky-cloud < /2025-03-21/usky-cloud.sql
  27. 如果不一致备份时需要加参数定位备份时的 LOG_POS
  28. 例如:
  29. /data/mysql-5.7.37/bin/mysqldump -uroot -p -h172.16.66.142 --all-databases --master-data=2 > /data/mysql_backup/usky.sql
  30. 备份文件中会有记录
  31. [client]
  32. #客户端连接端口
  33. port=3306
  34. #客户端连接sock
  35. socket=/opt/mysql5.7/log/mysql.socka
  36. #客户端编码
  37. default-character-set=utf8
  38. [mysqld]
  39. #mysql服务端口
  40. port=3306
  41. #安装目录
  42. basedir=/opt/mysql5.7
  43. #数据存放目录
  44. datadir=/opt/mysql5.7/data
  45. #sock文件地址
  46. socket=/opt/mysql5.7/log/mysql.sock
  47. #错误日志存放地址
  48. log-error=/opt/mysql5.7/log/mysql.log
  49. #pid文件地址
  50. pid-file=/opt/mysql5.7/log/mysql.pid
  51. #下面内容为mysq主备时配置,单mysql部署护理下面配置
  52. #server-id 多台服务器时,此表示需要唯一
  53. server-id=1
  54. #主从同步bin-log日志文件名
  55. log-bin=mysql-bin
  56. #主从同步时,需要同步的数据库,多个数据库写多行binlog_do_db配置
  57. binlog_do_db=test_db
  58. #主从同步时,不需要同步的数据库,多个数据库写多行binlog_ignore_db配置
  59. #binlog_ignore_db=mysql
  60. #binlog_ignore_db=information_schema
  61. #binlog_ignore_db=sys
  62. #binlog_ignore_db=performance_schema
  63. #主从同步方式
  64. binlog_format=row
  65. #服务端编码
  66. character-set-server=utf8
  67. !includedir /etc/my.cnf.d
  68. 3.修改129服务器/etc/my.cnf配置文件,只有server-id不同,为2配置如下
  69. [client]
  70. #客户端连接端口
  71. port=3306
  72. #客户端连接sock
  73. socket=/opt/mysql5.7/log/mysql.socka
  74. #客户端编码
  75. default-character-set=utf8
  76. [mysqld]
  77. #mysql服务端口
  78. port=3306
  79. #安装目录
  80. basedir=/opt/mysql5.7
  81. #数据存放目录
  82. datadir=/opt/mysql5.7/data
  83. #sock文件地址
  84. socket=/opt/mysql5.7/log/mysql.sock
  85. #错误日志存放地址
  86. log-error=/opt/mysql5.7/log/mysql.log
  87. #pid文件地址
  88. pid-file=/opt/mysql5.7/log/mysql.pid
  89. #下面内容为mysq主备时配置,单mysql部署护理下面配置
  90. #server-id 多台服务器时,此表示需要唯一
  91. server-id=2
  92. #主从同步bin-log日志文件名
  93. log-bin=mysql-bin
  94. #主从同步时,需要同步的数据库,多个数据库写多行binlog_do_db配置
  95. binlog_do_db=test_db
  96. #主从同步时,不需要同步的数据库,多个数据库写多行binlog_ignore_db配置
  97. #binlog_ignore_db=mysql
  98. #binlog_ignore_db=information_schema
  99. #binlog_ignore_db=sys
  100. #binlog_ignore_db=performance_schema
  101. #主从同步方式
  102. binlog_format=row
  103. #服务端编码
  104. character-set-server=utf8
  105. !includedir /etc/my.cnf.d
  106. 5.重启mysql服务
  107. [root@128 mysql5.7]# systemctl stop mysqld
  108. [root@128 mysql5.7]# systemctl start mysqld
  109. 四、mysql数据库双主双从配置
  110. 1.连接128服务器mysql,并创建主从同步账户slavebak,并查看master状态,记录下file、psition值,配置129mysql从库时使用
  111. [root@128 ~]# /opt/mysql5.7/bin/mysql -uroot -proot
  112. mysql: [Warning] Using a password on the command line interface can be insecure.
  113. ......
  114. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
  115. mysql> grant replication slave on *.* to slavebak@'%' identified by 'slavebak';
  116. mysql> flush privileges;
  117. mysql> show master status;
  118. +------------------+----------+--------------+------------------+-------------------+
  119. | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
  120. +------------------+----------+--------------+------------------+-------------------+
  121. | mysql-bin.000002 | 1287 | test_db | | |
  122. +------------------+----------+--------------+------------------+-------------------+
  123. 1 row in set (0.01 sec)
  124. mysql>
  125. 2.连接129服务器,使用slavebak用户远程登录128mysql,测试连接是否正常。
  126. [root@129 ~]# /opt/mysql5.7/bin/mysql -h192.168.222.128 -uslavebak -pslavebak
  127. mysql: [Warning] Using a password on the command line interface can be insecure.
  128. ......
  129. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
  130. mysql> exit;
  131. [root@129 ~]#
  132. 3.在129服务器用root连接本服务器mysql,并配置128的主库信息
  133. [root@129 ~]# /opt/mysql5.7/bin/mysql -uroot -proot
  134. mysql: [Warning] Using a password on the command line interface can be insecure.
  135. ......
  136. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
  137. mysql> change master to
  138. -> master_host='192.168.222.128', #128服务器mysql ip
  139. -> master_port=3306, #128服务器mysql端口
  140. -> master_user='slavebak', #128服务器mysql从库同步用户
  141. -> master_password='slavebak', #128服务器mysql从库同步用户密码
  142. -> master_log_file='mysql-bin.000002', #前面记录的128服务mysql file值
  143. -> master_log_pos=1287; #前面记录的128服务mysql psition值
  144. Query OK, 0 rows affected, 2 warnings (0.02 sec)
  145. mysql> start slave; #启动从库配置
  146. 4.查看129从库配置是否成功Slave_IO_Running、Slave_SQL_Running都为yes则成功
  147. mysql> show slave status;
  148. mysql> show slave status \G;
  149. *************************** 1. row ***************************
  150. ......
  151. Slave_IO_Running: Yes #此值为yes配置成功
  152. Slave_SQL_Running: Yes #此值为yes配置i成功
  153. ......
  154. 1 row in set (0.01 sec)
  155. 5.在129服务器mysql创建主从同步账户slavebak,查看master状态,记录下file、psition值
  156. mysql> grant replication slave on *.* to slavebak@'%' identified by 'slavebak';
  157. mysql> flush privileges;
  158. mysql> show master status;
  159. +------------------+----------+--------------+------------------+-------------------+
  160. | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
  161. +------------------+----------+--------------+------------------+-------------------+
  162. | mysql-bin.000002 | 848 | test_db | | |
  163. +------------------+----------+--------------+------------------+-------------------+
  164. 1 row in set (0.01 sec)
  165. 6.连接128服务器并使用root用户连接本服务器mysql,配置129的主库信息
  166. [root@128 ~]# /opt/mysql5.7/bin/mysql -uroot -proot
  167. mysql: [Warning] Using a password on the command line interface can be insecure.
  168. ......
  169. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
  170. mysql> change master to
  171. -> master_host='192.168.222.129', #129服务器mysql ip
  172. -> master_port=3306, #129服务器mysql端口
  173. -> master_user='slavebak', #129服务器mysql从库同步用户
  174. -> master_password='slavebak', #129服务器mysql从库同步用户密码
  175. -> master_log_file='mysql-bin.000002', #前面记录的129服务mysql file值
  176. -> master_log_pos=848; #前面记录的129服务mysql psition值
  177. Query OK, 0 rows affected, 2 warnings (0.02 sec)
  178. mysql> start slave; #启动从库配置
  179. 7.查看128从库配置是否成功Slave_IO_Running、Slave_SQL_Running都为yes则成功
  180. mysql> show slave status;
  181. mysql> show slave status \G;
  182. *************************** 1. row ***************************
  183. ......
  184. Slave_IO_Running: Yes #此值为yes配置成功
  185. Slave_SQL_Running: Yes #此值为yes配置i成功
  186. ......
  187. 1 row in set (0.01 sec)
  188. 至此,128服务器,129服务器双主双从配置完成
  189. 五、MySQL双主双从测试
  190. 1.连接128服务器,使用root用户连接本机mysql,并创建test_db数据库,t_test表,并插入一条数据id=1,name='zhangsan'
  191. [root@128 ~]# /opt/mysql5.7/bin/mysql -uroot -proot
  192. mysql: [Warning] Using a password on the command line interface can be insecure.
  193. ......
  194. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
  195. mysql> create database test_db;
  196. Query OK, 1 row affected (0.00 sec)
  197. mysql> use test_db;
  198. mysql> create table t_test(id int primary key, name varchar(30));
  199. Query OK, 0 row affected (0.01 sec)
  200. mysql> insert into t_test values (1, 'zhangsan');
  201. Query OK, 1 row affected (0.01 sec)
  202. mysql> select * from t_test;
  203. +----+----------+
  204. | id | name |
  205. +----+----------+
  206. | 1 | zhangsan |
  207. +----+----------+
  208. 1 rows in set (0.00 sec)
  209. 2.连接129服务器,使用root用户连接mysql,查看test_db数据库、t_test表以及数据是否同步,并插入id=2,name=‘lisi’
  210. [root@129 ~]# /opt/mysql5.7/bin/mysql -uroot -proot
  211. mysql: [Warning] Using a password on the command line interface can be insecure.
  212. ......
  213. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
  214. mysql> show databases;
  215. +--------------------+
  216. | Database |
  217. +--------------------+
  218. | information_schema |
  219. | mysql |
  220. | performance_schema |
  221. | sys |
  222. | test_db | #test_db数据库已同步过来
  223. +--------------------+
  224. 5 rows in set (0.01 sec)
  225. mysql> use test_db;
  226. mysql> show tables;
  227. +-------------------+
  228. | Tables_in_test_db |
  229. +-------------------+
  230. | t_test | #t_test表已同步过来
  231. +-------------------+
  232. 1 row in set (0.01 sec)
  233. mysql> select * from t_test;
  234. +----+----------+
  235. | id | name |
  236. +----+----------+
  237. | 1 | zhangsan | #数据已同步过来
  238. +----+----------+
  239. 1 rows in set (0.00 sec)
  240. mysql> insert into t_test values (2, 'lisi');
  241. Query OK, 1 row affected (0.01 sec)
  242. 3.在128服务器查看id=2,name="lisi" 是否同步
  243. [root@128 ~]# /opt/mysql5.7/bin/mysql -uroot -proot
  244. mysql: [Warning] Using a password on the command line interface can be insecure.
  245. ......
  246. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
  247. mysql> select * from t_test;
  248. +----+----------+
  249. | id | name |
  250. +----+----------+
  251. | 1 | zhangsan |
  252. | 2 | lisi | #lisi数据已同步
  253. +----+----------+
  254. 1 rows in set (0.00 sec)
  255. 至此,数据库双主双从测试完成。
  256. 六、keepalived安装
  257. 128、129两台服务器安装步骤相同,配置文件不同,下面有介绍。
  258. 1.安装相关依赖包,并下载keepalived安装包,解压,配置,编译
  259. [root@128 ~]# cd /opt
  260. [root@128 opt]# yum -y install gcc openssl-devel popt-devel psmisc
  261. [root@128 opt]# wget https://www.keepalived.org/software/keepalived-2.2.7.tar.gz
  262. [root@128 opt]# tar -zxvf keepalived-2.2.7.tar.gz
  263. [root@128 opt]# cd keepalived-2.2.7
  264. [root@128 keepalived-2.2.7]# ./configure --prefix=/opt/keepalived-2.2.7
  265. [root@128 keepalived-2.2.7]# make && make install
  266. 2.将文件复制到对应目录下
  267. [root@128 keepalived-2.2.7]# mkdir /etc/keepalived
  268. [root@128 keepalived-2.2.7]# cp keepalived/etc/keepalived/keepalived.conf.sample /etc/keepalived/keepalived.conf
  269. [root@128 keepalived-2.2.7]# cp keepalived/etc/init.d/keepalived /etc/init.d/
  270. [root@128 keepalived-2.2.7]# cp keepalived/etc/sysconfig/keepalived /etc/sysconfig/
  271. [root@128 keepalived-2.2.7]# cp bin/keepalived /usr/sbin/
  272. 3.新建/etc/keepalived/shutdown.sh文件,内容为:
  273. #!/bin/bash
  274. #该脚本是在mysql服务出现异常时,将keepalived应用停止,从而使虚拟vip主机自动连接到另一台mysql上
  275. killall keepalived
  276. 4.使用ifconfig命令查看下网卡名称,本机网卡名称为ens33
  277. 5.修改128服务器/etc/keepalived/keepalived.conf配置文件,内容如下:
  278. ! Configuration File for keepalived
  279. global_defs {
  280. notification_email {
  281. acassen@firewall.loc
  282. failover@firewall.loc
  283. sysadmin@firewall.loc
  284. }
  285. notification_email_from Alexandre.Cassen@firewall.loc
  286. smtp_server 192.168.200.1
  287. smtp_connect_timeout 30
  288. router_id LVS_MASTER
  289. vrrp_skip_check_adv_addr
  290. vrrp_strict
  291. vrrp_garp_interval 0
  292. vrrp_gna_interval 0
  293. }
  294. vrrp_instance VI_1 {
  295. state MASTER
  296. #interface为刚才查到的本机网卡名称
  297. interface ens33
  298. #同一网段中同一组virtual_router_id值相同。不同组virtual_router_id值唯一。
  299. #如server-1、server-2为一组,virtual_router_id=51
  300. #server-3、server-4为一组,则virtual_router_id不能为51
  301. virtual_router_id 51
  302. #字数越大,优先级越高,master必须大于backup
  303. priority 100
  304. advert_int 1
  305. authentication {
  306. auth_type PASS
  307. auth_pass 1111
  308. }
  309. virtual_ipaddress {
  310. #该ip为虚拟出来的vip地址
  311. 192.168.222.130
  312. }
  313. }
  314. #配置virtual_server ip为上面配置的虚拟vip地址 端口为mysql的端口
  315. virtual_server 192.168.222.130 3306 {
  316. delay_loop 6
  317. lb_algo rr
  318. lb_kind NAT
  319. persistence_timeout 50
  320. protocol TCP
  321. #real_server 该配置为实际物理机ip地址 以及实际物理机mysql端口
  322. real_server 192.168.222.128 3306 {
  323. #当该ip 端口连接异常时,执行该脚本
  324. notify_down /etc/keepalived/shutdown.sh
  325. TCP_CHECK {
  326. #实际物理机ip地址
  327. connect_ip 192.168.222.128
  328. #实际物理机port端口
  329. connect_port 3306
  330. connect_timeout 3
  331. nb_get_retry 3
  332. delay_before_retry 3
  333. }
  334. }
  335. }
  336. 6.修改129服务器/etc/keepalived/keepalived.conf配置文件,与128的配置不同地方为real_server、connect_ip 两个配置,需要配置对应的实际主机ip,详细内容如下:
  337. ! Configuration File for keepalived
  338. global_defs {
  339. notification_email {
  340. acassen@firewall.loc
  341. failover@firewall.loc
  342. sysadmin@firewall.loc
  343. }
  344. notification_email_from Alexandre.Cassen@firewall.loc
  345. smtp_server 192.168.200.1
  346. smtp_connect_timeout 30
  347. router_id LVS_MASTER
  348. vrrp_skip_check_adv_addr
  349. vrrp_strict
  350. vrrp_garp_interval 0
  351. vrrp_gna_interval 0
  352. }
  353. vrrp_instance VI_1 {
  354. state BACKUP
  355. #interface为刚才查到的本机网卡名称
  356. interface ens33
  357. #同一网段中同一组virtual_router_id值相同。不同组virtual_router_id值唯一。
  358. #如server-1、server-2为一组,virtual_router_id=51
  359. #server-3、server-4为一组,则virtual_router_id不能为51
  360. virtual_router_id 51
  361. #字数越大,优先级越高,master必须大于backup
  362. priority 90
  363. advert_int 1
  364. authentication {
  365. auth_type PASS
  366. auth_pass 1111
  367. }
  368. virtual_ipaddress {
  369. #该ip为虚拟出来的vip地址
  370. 192.168.222.130
  371. }
  372. }
  373. #配置virtual_server ip为上面配置的虚拟vip地址 端口为mysql的端口
  374. virtual_server 192.168.222.130 3306 {
  375. delay_loop 6
  376. lb_algo rr
  377. lb_kind NAT
  378. persistence_timeout 50
  379. protocol TCP
  380. #real_server 该配置为实际物理机ip地址 以及实际物理机mysql端口
  381. real_server 192.168.222.129 3306 {
  382. #当该ip 端口连接异常时,执行该脚本
  383. notify_down /etc/keepalived/shutdown.sh
  384. TCP_CHECK {
  385. #实际物理机ip地址
  386. connect_ip 192.168.222.129
  387. #实际物理机port端口
  388. connect_port 3306
  389. connect_timeout 3
  390. nb_get_retry 3
  391. delay_before_retry 3
  392. }
  393. }
  394. }
  395. 详细配置参考《Keepalived 安装和配置详解》
  396. 7.将128、129服务器keepalived加入开机自启,并启动服务
  397. [root@128 keepalived-2.2.7]# systemctl enable keepalived
  398. [root@128 keepalived-2.2.7]# systemctl start keepalived
  399. 8.启动后keepalived状态为:active(running)则正常
  400. 9.启动后相当于虚拟出一个vip 192.168.222.130,可使用远程连接工具,连接该服务器,连接进去后使用ifconfig查看该虚拟vip实际上使用的实体服务器是129服务器。
  401. 10.将129服务器的keepalived应用停止,再次查看130服务ifconfig,可以看到,130服务器自动将实体机ip漂移到了128服务器上
  402. 至此,keepalived部署完成。
  403. 七、mysql双主双活+keepalived高可用整体测试
  404. 1.首先将128、129两台服务器mysql、keepalived应用全部启动,然后用mysql连接工具连接keepalived虚拟出来的192.168.222.130服务器
  405. 2.再130数据库test_db库t_test表插入id=3,name='wangwu'
  406. 3.此时可以查看128、129数据库,数据已同步
  407. 4.查看130服务器ifconfig实际使用的物理机为128,所以128服务器mysql为主数据库。
  408. 5.此时手动将128服务器mysql停止,keepalived检测到128服务3306端口连接失败,会执行/etc/keepalived/shutdown.sh脚本,将128服务器keepalived应用结束。
  409. 6.此时再连接130服务下,ifconfig查看,发现已经实际将物理机由128转移到129服务器上
  410. 7.再使用mysql连接工具连接130的mysql,插入一条数据id=4,name='zhaoliu',测试是否将数据存入129服务器mysql中
  411. 8.查看129服务器mysql数据,数据已同步,说明keepalived搭建高可用成功,当128服务器mysql出现问题后keepalived自动漂移IP到实体机129服务器上,从而使129服务器mysql作为主数据库。
  412. 9.此时再启动128服务器mysql、keepalived应用
  413. 10.查看128数据库t_test表数据,数据已同步成功。
  414. 11.如果漂移失败,可能是virtual_router_id在同网段内重复导致。可执行命令查看是否有其他ip使用
  415. [root@128 keepalived-2.2.7]# tcpdump -i 网卡名 vrrp -n |grep virtual_router_id值
  416. #例如:
  417. [root@128 keepalived-2.2.7]# tcpdump -i eno16777736 vrrp -n |grep 51
  418. 至此,mysql双主双活+keepalived高可用部署并测试完成。
  419. 8、mysql是数据库双主双活配置与上面相同,不同的为配置高可用第六步
  420. nginx配置mysql数据库的高可用
  421. 在配置Nginx作为MySQL数据库的高可用解决方案时,通常我们会采用一些策略来确保MySQL数据库服务的持续性和可用性。这里我将介绍几种常见的策略,包括使用Nginx作为负载均衡器、配置MySQL主从复制、以及使用Nginx的代理缓存功能。
  422. 1. 使用Nginx作为负载均衡器
  423. Nginx可以作为负载均衡器,将请求分发到多个MySQL服务器上,从而分散压力和增加系统的可用性。
  424. 配置步骤:
  425. 1、安装Nginx
  426. (如果尚未安装):自行安装
  427. 2、配置Nginx负载均衡:
  428. 编辑Nginx的配置文件,通常位于/etc/nginx/nginx.conf或者/etc/nginx/sites-available/目录下的某个文件。
  429. 根据实际需求,在Nginx的配置中选择合适的负载均衡算法。常见的负载均衡算法包括轮询(Round Robin)、权重(Weighted)、IP哈希(IP Hash)等。
  430. 轮询算法:Nginx按照请求的顺序依次将请求分发给每个备份服务器。这是默认的负载均衡算法,适用于服务器性能相近的情况。
  431. 权重算法:可以为每个备份服务器设置权重,以便更多的请求被分发到性能更好或更强大的服务器上。根据服务器的处理能力来调整权重值,以达到负载均衡的效果。
  432. IP哈希算法:根据客户端的IP地址进行哈希计算,将同一客户端的请求始终分发到相同的备份服务器。这样可以确保与特定客户端的会话始终在同一个服务器上进行处理,适用于有状态的应用程序。
  433. nginx.conf添加下面配置
  434. stream {
  435. include /etc/nginx/stream.d/*.conf;
  436. }
  437. 轮询算法:
  438. 在/etc/nginx/stream.d下创建编辑mysql_proxy.conf
  439. upstream mysql_servers {
  440. server 192.168.222.128:3306;
  441. #server 192.168.222.129:3306; #如果不加backup会顺序依次将请求分发给每个服务器
  442. server 192.168.222.129:3306 backup;
  443. }
  444. server {
  445. listen 3307;
  446. proxy_pass mysql_servers;
  447. }
  448. 权重算法
  449. 在/etc/nginx/stream.d下创建编辑mysql_proxy.conf
  450. upstream mysql_servers {
  451. server 192.168.222.128:3306 weight=3;
  452. server 192.168.222.129:3306 weight=1;
  453. }
  454. server {
  455. listen 3307;
  456. proxy_pass mysql_servers;
  457. }
  458. 使用 http 上下文实现 IP 哈希
  459. 如果你需要基于 IP 哈希的负载均衡,可以考虑将 MySQL 流量通过 HTTP 模块代理。但这通常不推荐,因为 MySQL 使用的是 TCP 协议,而不是 HTTP 协议。不过,如果你的场景允许,可以尝试以下配置:
  460. http {
  461. upstream mysql_servers {
  462. ip_hash;
  463. server 192.168.222.128:3306;
  464. server 192.168.222.129:3306 backup;
  465. }
  466. server {
  467. listen 3307;
  468. location / {
  469. proxy_pass http://mysql_servers;
  470. proxy_set_header Host $host;
  471. proxy_set_header X-Real-IP $remote_addr;
  472. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  473. }
  474. }
  475. }
  476. 3、使用Nginx的代理缓存功能加速读取操作(可选)
  477. 虽然这并不直接提供高可用性,但可以减轻数据库服务器的读取压力。你可以在Nginx中配置静态内容的缓存。
  478. 配置步骤:
  479. 在Nginx配置中添加缓存指令:
  480. location / {
  481. proxy_pass http://mysql_servers;
  482. proxy_cache one; # 使用名为"one"的缓存区,需要先定义缓存区大小等配置项。
  483. proxy_cache_valid 200 302 60m; # 设置缓存有效期为60分钟。
  484. proxy_cache_key $request_method:$scheme:$host$request_uri;
  485. mysql数据库中查询当前服务器host
  486. mysql> SELECT @@hostname AS 'Host', @@port AS 'Port';
  487. +-------------------------+------+
  488. | Host | Port |
  489. +-------------------------+------+
  490. | iZbp126fstzhkzq3ifwcmrZ | 3306 |
  491. +-------------------------+------+
  492. 1 row in set
  493. mysql>
  494. 两台不同账号同一区域阿里云服务器如何实现内网互通?
  495. 原文链接:https://blog.csdn.net/weixin_44678969/article/details/136769184
  496. 1.登录阿里云平台
  497. 2.[开通peer对等]
  498. 点击右上角的控制台,然后进行搜索专有网络VPC。
  499. 点击进入专有网络VPC界面操作步骤如下:
  500. (1)点击VPC对等连接,然后开通VPC对等连接后创建对等连接。
  501. (2)在另一台服务器B上也同时开通VPC对等连接服务,然后点击专有网络生成默认的专有网络。
  502. (3)在服务器B的这个VPC对等连接对面接收发起的对等连接即可。
  503. (4)分别在A,B服务器的VPC对等连接界面的配置路由条目中配置对方所在的交换机网络(IP+掩码)
  504. 如果在A,B服务器的VPC对等连接中都配置,那么就可以Ping对方的内网IP了。
  505. 问题:
  506. (1)在配置路由条目时,填写对方的交换机网段时报错的原因:
  507. 这个原因是存在网络冲突,即服务器A和服务器B的交换机网段重叠了导致配置失败。那如何解决这个问题呢?
  508. 首先在ESC服务器中关掉该主机,然后重新创建一个交换机,在创建时填写一个与另一个服务器的交换机不在同一个网段的地址即可。
  509. 创建完成之后,需要在VPC连接界面删除掉原来那个冲突的交换机实例即可。
  510. 最后在重新配置一下VPC连接的路由条目后就能使内网互通。
  511. 这是不账号同区域的情况不需要付费,如果时不同账号不同区域则需要付费使用VPC连接服务。
  512. 注意:
  513. 如果内网还是不通,记得看看两台服务器有没有开机!!!
  514. 看看私网地址有没有填写正确
  515. 最后还不能解决,可以使用工单提交你所遇到的问题,一般工程师都会快速回复你的。
  516. 我们配置好MySQL主主同步时,是可以实现主主同步,但是重启机器后或者其他原因导致MySQL无法同步了。
  517. 一、问题描述:
  518. 当我们配置好MySQL主主同步时,是可以实现主主同步,但是重启机器后或者其他原因导致MySQL无法同步了。
  519. https://www.cnblogs.com/qiangyuzhou/p/14635890.html
  520. https://www.cnblogs.com/l-hh/p/9922548.html#
  521. 如果提示数据冲突需执行下面命令一条一条跳过错误数据
  522. STOP SLAVE;
  523. SET GLOBAL sql_slave_skip_counter = 1;
  524. START SLAVE;
  525. SHOW SLAVE STATUS\G;
  526. 二、Slave两个关键进程
  527. mysql replication 中slave机器上有两个关键的进程,死一个都不行,一个是slave_sql_running,一个是Slave_IO_Running,一个负责与主机的io通信,一个负责自己的slave mysql进程。
  528. 三、如果是Slave_SQL_Running:no:
  529. 解决办法如下:
  530. mysql > stop slave;
  531. mysql > SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1; START SLAVE;
  532. mysql > start slave;
  533. mysql > show slave status\G;
  534. 四、如果是slave_io_running:no
  535. 解决办法如下:
  536. 1、查看主服务器
  537. mysql > show slave status\G;
  538. 2、在从服务器上查看
  539. 问题所在:发现Master_Log_File没有对应。
  540. 3、出现Slave_IO_Running: No的机器上操作
  541. MariaDB [(none)]> stop slave;
  542. MariaDB [(none)]>CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000026', MASTER_LOG_POS=0;
  543. MariaDB [(none)]> start slave;
  544. MariaDB [(none)]> show slave status\G
  545. 到此问题就解决了!