高可用mysql集群搭建(mysql5.6+keepalived)

2023-10-31


1、方案在一定程度上保证主库的高可用,在一台主库down掉之后,可以在极短的时间内切换到另一台从库上(尽可能减少主库宕机对业务造成的影响)

(1)      一台主库(master)提供服务,只负责数据的写入

(2)      一台数据库服务器资源做master主库的从库,之间做主从同步

(3)      两台主库之间做高可用,采用keepalived,master同时也作为keepalived的主

(4)      程序调用使用高可用的keepalived VIP的地址

(5)      所有提供服务的从服务器与master进行主从同步


图1-1 mysql集群系统框架图

2、主从复制详细搭建过程

在集群中的所有服务器上搭建mysql服务,一般采用的是源码包安装。

MySQL-VIP:192.168.237.200  

MySQL-version: mysql-5.5.36

MySQL-master:192.168.237.127 

MySQL-slave01:192.168.237.128

MySQL-slave02:192.168.237.128

Keepalived版本:1.1.20

4、安装依赖包

yum-y install cmake make gcc gcc-c++  ncurses-devel bisonopenssl-devel

5、所需要的用户/组

groupadd mysql

useradd -gmysql -r mysql

6、源码包

wgethttp://dev.mysql.com/get/Downloads/MySQL-5.5/mysql-5.5.36.tar.gz

7、安装所需的目录

mkdir /data/mydata/{data,tmp,logs,mysqllog}

cd /data/mydata/mysqllogs

mkdir logs

修改权限:

chgrp -R mysql /data/mydata/data&& chown -R mysql /data/mydata/data

chgrp -R mysql /data/mydata/logs&& chown -R mysql /data/mydata/logs

chgrp -R mysql /data/mydata/tmp&& chown -R mysql /data/mydata/tmp

chgrp -R mysql /data/mydata/mysqllog&& chown -R mysql /data/mydata/mysqllog

                                                                                                              

tar xf mysql-5.5.36.tar.gz

cd mysql-5.5.36

cmake \

-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \

-DMYSQL_DATADIR=/data/mydata/data \

-DSYSCINFDIR=/etc \

-DWITH_INNOBASE_STORAGE_ENGINE=1 \

-DWITH_ARCHIVE_STORAGE_ENGINE=1 \

-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \

-DWITH_READLINE=1 \

-DWITH_SSL=system \

-DWITH_ZLIB=system \

-DWITH_LIBWARP=0 \

-DWITH_UNIX_ADDR=/tmp/mysql.sock \

-DDEFAULT_CHARASET=uft8 \

-DDEFAULT_COLLATTON=utf9_general_ci

make && make install

9、提供启动脚本

cp support-files/mysql.server /etc/rc.d/init.d/mysqld

10、主库提供配置文件

[client]

port = 3306

socket = /var/lib/mysql/mysql.sock

default-character-set=utf-8

[mysqld]

server-id = 1

port = 3306

user = mysql

basedir = /usr/local/mysql

datadir = /data/mydata/data

tmpdir = /data/mydata/tmp

socket = /var/lib/mysql/mysql.sock

skip-external-locking

skip-name-resolve

default-storage-engine = INNODB

character-set-server = utf8

wait-timeout = 100

connect_timeout = 20

interactive_timeout = 100

back_log = 300

myisam_recover

event_scheduler = on

log-bin=/data/mydata/logs/mysql-bin

binlog_format = row

max_binlog_size = 64M

binlog_cache_size = 1M

slave-net-timeout = 10

skip-slave-start

slow_query_log  = 1

long_query_time = 1

slow_query_log_file = /data/mydata/mysqllog/logs/mysql.slow

log-error= /data/mydata/mysqllog/logs/error.log

max_connections = 1000

max_user_connections = 1000

max_connect_errors = 10000

key_buffer_size =32M     #以MyISAM为主的服务器,要调大此值

max_allowed_packet = 64M

table_cache = 4096

table_open_cache = 4096

table_definition_cache = 4096

sort_buffer_size =512K      

read_buffer_size =512K      

read_rnd_buffer_size = 512K  

join_buffer_size =512K      

tmp_table_size = 64M     

max_heap_table_size = 64M  

query_cache_type = 0

query_cache_size = 0

bulk_insert_buffer_size = 16M

thread_cache_size = 64

thread_concurrency =16       #CPU核数*2

thread_stack = 256K

innodb_data_home_dir = /data/mydata/data

innodb_log_group_home_dir= /data/mydata/mysqllog/logs

innodb_data_file_path = ibdata1:1G:autoextend

innodb_buffer_pool_size = 16G

innodb_buffer_pool_instances =4              

innodb_additional_mem_pool_size = 16M

innodb_log_file_size = 512M

innodb_log_buffer_size = 32M

innodb_log_files_in_group = 3

innodb_flush_log_at_trx_commit = 2

innodb_lock_wait_timeout = 10

innodb_sync_spin_loops = 40

innodb_max_dirty_pages_pct = 90

innodb_support_xa = 1

innodb_thread_concurrency = 0

innodb_thread_sleep_delay = 500

innodb_file_io_threads = 4

innodb_concurrency_tickets = 1000

log_bin_trust_function_creators = 1

innodb_flush_method = O_DIRECT

innodb_file_per_table          #是否采用单表单空间

innodb_write_io_threads = 8 

innodb_read_io_threads = 8

innodb_io_capacity = 1000

innodb_file_format =Barracuda    #不开启单表单空间,此选项无效

innodb_purge_threads = 1

innodb_purge_batch_size = 32

innodb_old_blocks_pct = 75

innodb_change_buffering = all

transaction_isolation = READ-COMMITTED

[mysqldump]

quick

max_allowed_packet = 32M

[mysql]

no-auto-rehash

[myisamchk]

key_buffer_size = 64M

sort_buffer_size = 256M

read_buffer = 2M

write_buffer = 2M

[mysqlhotcopy]

interactive-timeout

[mysqld_safe]

open-files-limit = 10240

3.8  为salve提供配置文件

slave的配置文件仅需在master上稍作修改

server-id = 20

log_slave_updates = 1 #添加(将复制事件写入binlog,一台服务器既做主库又做从库此选项必须要开启)

replicate-same-server-id=0 #添加(防止MySQL循环更新)

relay_log_recovery = 1   #添加(MySQLrelay_log的自动修复功能)

3.9  为从库提供配置文件

[client]

port = 3306

socket = /var/lib/mysql/mysql.sock

default-character-set = utf8

[mysqld]

server-id = 2

port = 3306

user = mysql

basedir = /usr/local/mysql

datadir = /data/mydata/data

tmpdir  = /data/mydata/tmp

socket = /var/lib/mysql/mysql.sock

skip-external-locking

skip-name-resolve

default-storage-engine = INNODB

character-set-server = utf8

wait-timeout = 100

connect_timeout = 20

interactive_timeout = 100

back_log = 300

myisam_recover

event_scheduler = on

log-bin=/data/mydata/logs/mysql-bin

binlog_format = row

max_binlog_size = 64M

binlog_cache_size = 1M

slave-net-timeout = 10

relay_log_recovery = 1

slow_query_log = 1

long_query_time = 1

slow_query_log_file= /data/mydata/mysqllog/logs/mysql.slow

log-error= /data/mydata/mysqllog/logs/error.log

max_connections = 500

max_user_connections = 500

max_connect_errors = 10000

key_buffer_size =32M     #以MyISAM为主的服务器,要调大此值

max_allowed_packet = 64M

table_cache = 2048

table_open_cache = 2048

table_definition_cache = 2048

sort_buffer_size =128K      

read_buffer_size =128K      

read_rnd_buffer_size = 128K  

join_buffer_size =128K      

tmp_table_size =16M     

max_heap_table_size = 16M  

query_cache_type = 0

query_cache_size = 0

bulk_insert_buffer_size = 16M

thread_cache_size = 64

thread_concurrency =4       #CPU核数*2

thread_stack = 128K

innodb_data_home_dir= /data/mydata/data

innodb_log_group_home_dir= /data/mydata/mysqllog/logs

innodb_data_file_path =ibdata1:1G:autoextend

innodb_buffer_pool_size = 2G

innodb_buffer_pool_instances =4              

innodb_additional_mem_pool_size = 4M

innodb_log_file_size = 512M

innodb_log_buffer_size = 16M

innodb_log_files_in_group = 3

innodb_flush_log_at_trx_commit = 2

innodb_lock_wait_timeout = 10

innodb_sync_spin_loops = 40

innodb_max_dirty_pages_pct = 90

innodb_support_xa = 1

innodb_thread_concurrency = 0

innodb_thread_sleep_delay = 500

innodb_file_io_threads = 4

innodb_concurrency_tickets = 1000

log_bin_trust_function_creators = 1

innodb_flush_method =O_DIRECT   

innodb_file_per_table                #是否采用单表单空间

innodb_write_io_threads = 8 

innodb_read_io_threads = 8

innodb_io_capacity = 1000

innodb_file_format =Barracuda     #不开启单表单空间,此选项无效

innodb_purge_threads = 1

innodb_purge_batch_size = 32

innodb_old_blocks_pct = 75

innodb_change_buffering = all

transaction_isolation = READ-COMMITTED

[mysqldump]

quick

max_allowed_packet = 32M

[mysql]

no-auto-rehash

[myisamchk]

key_buffer_size = 64M

sort_buffer_size = 256M

read_buffer = 2M

write_buffer = 2M

[mysqlhotcopy]

interactive-timeout

[mysqld_safe]

open-files-limit = 10240

3.10     初始化MySQL

/usr/local/mysql/scripts/mysql_install_db --user=mysql--datadir=/data/mydata/data/ --basedir=/usr/local/mysql

3.11     为启动脚本赋予可执行权限并启动MySQL

chmod +x /etc/rc.d/init.d/mysqld

/etc/init.d/mysqld start

3.12     映射命令路径

ln -s /usr/local/mysql/bin/mysql/usr/bin/mysql

3.13     关闭防火墙

关闭命令:  service iptables stop 

永久关闭防火墙:chkconfig iptables off

两个命令同时运行,运行完成后查看防火墙关闭状态 

service iptables status

3.14     配置master

3.12.1 添加同步账户

mysql> grant replication slaveon *.* to 'repl'@'192.168.216.%' idetified by 'repl';

mysql> flush privileges;

3.12.2查看主库状态

mysql> show master status;

3.15     配置slave

3.13.1配置slave为master的从

grant replication slave on *.* to'repl'@'%' identified by 'repl';

flush privileges;

#若是线上有数据需要先导入数据

mysql> CHANGE MASTER TO

  ->MASTER_HOST='192.168.237.128',

  ->MASTER_PORT=3306,

  ->MASTER_USER='repl',

  ->MASTER_PASSWORD='123456',

  ->MASTER_LOG_FILE='mysql-bin.000009',

  ->MASTER_LOG_POS=652;

Query OK, 0 rows affected (0.03sec)

mysql> start slave;

mysql> show slave status \G

 Slave_IO_Running:Yes   #确保为yes

  Slave_SQL_Running:Yes  #确保为yes

如果显示

Slave_IO_State: Waiting to reconnect aftera failed registration on master

3.13.2 配置slave的同步用户

mysql> grant replication slave on *.* to 'repl’@’192.168.237.%' identifiedby '123456';

mysql> flush privileges;

3.13.3 查看slave的状态

mysql> showmaster status;                                                                     

3.16     从库根据配置slave的从即可。

4        Keepalived架构图

图1-2keepalived架构图

5        keepalived安装及配置

1.    

2.    

3.    

4.    

5.    

5.1.    安装keepalived

tar zxvf keepalived-1.1.20.tar.gz 

cd keepalived-1.1.20 

yum install popt-devel,

./configure--prefix=/usr/local/keepalived--with-kernel-dir=/usr/src/kernels/2.6.32-431.el6.x86_64/

make && make install

5.2.    配置

我们自己在新建一个配置文件,默认情况下keepalived启动时会去/etc/keepalived目录下找配置文件

mkdir /etc/keepalived 

vi /etc/keepalived/keepalived.conf 

! Configuration File for keepalived 

global_defs {  

     notification_email { 

     luwenju@live.cn 

     } 

     notification_email_from luwenju@live.cn 

     smtp_server 127.0.0.1 

     smtp_connect_timeout 30 

     router_id MySQL-ha 

     } 

 

vrrp_instance VI_1 { 

     state BACKUP   #两台配置此处均是BACKUP  

     interface eth0 

     virtual_router_id 51 

     priority 100   #优先级,另一台改为90  

     advert_int 1 

     nopreempt  #不抢占,只在优先级高的机器上设置即可,优先级低的机器不设置  

     authentication { 

     auth_type PASS 

     auth_pass 1111 

     } 

     virtual_ipaddress { 

     192.168.237.200 

     } 

     } 

 

virtual_server 192.168.237.200 3306 { 

     delay_loop 2   #每个2秒检查一次real_server状态  

     lb_algo wrr   #LVS算法  

     lb_kind DR    #LVS模式  

     persistence_timeout 60   #会话保持时间  

     protocol TCP 

     real_server 192.168.237.127 3306 { 

     weight 3 

     notify_down /usr/local/MySQL/bin/MySQL.sh  #检测到服务down后执行的脚本  

     TCP_CHECK { 

     connect_timeout 10    #连接超时时间  

     nb_get_retry 3       #重连次数  

     delay_before_retry 3   #重连间隔时间  

     connect_port 3306   #健康检查端口  

     } 

     } 

编写检测服务down后所要执行的脚本

vi /usr/local/MySQL/bin/MySQL.sh 

#!/bin/sh  

pkill keepalived  

#chmod +x /usr/local/mysql/bin/mysql.sh 

注:此脚本是上面配置文件notify_down选项所用到的,keepalived使用notify_down选项来检查real_server的服务状态,当发现real_server服务故障时,便触发此脚本;我们可以看到,脚本就一个命令,通过pkill keepalived强制杀死keepalived进程,从而实现了MySQL故障自动转移。另外,我们不用担心两个MySQL会同时提供数据更新操作,因为每台MySQL上的keepalived的配置里面只有本机MySQL的IP+VIP,而不是两台MySQL的IP+VIP

5.3.    启动keepalived

/usr/local/keepalived/sbin/keepalived –D 

ps -aux | grep keepalived 

5.4.    主库keepalived测试

找一台局域网服务器,然后去ping  MySQL的VIP,这时候MySQL的VIP是可以ping的通的停止MySQL服务,看keepalived健康检查程序是否会触发我们编写的脚本.

5.5.    从库keepalived安装及配置

tar zxvf keepalived-1.1.20.tar.gz 

cd keepalived-1.1.20 

./configure --prefix=/usr/local/keepalived --with-kernel-dir=/usr/src/kernels/2.6.18-164.el5-i686 

make && make install

5.6.    配置keepalived

这台配置和上面基本一样,但有三个地方不同:优先级为90、无抢占设置、real_server为本机IP:

mkdir /etc/keepalived 

vi /etc/keepalived/keepalived.conf 

! Configuration File for keepalived 

global_defs {  

     notification_email { 

     luwenju@live.cn 

     } 

     notification_email_from luwenju@live.cn 

     smtp_server 127.0.0.1 

     smtp_connect_timeout 30 

     router_id MySQL-ha 

     } 

 

vrrp_instance VI_1 { 

     state BACKUP 

     interface eth0 

     virtual_router_id 51 

     priority 90 

     advert_int 1 

     authentication { 

     auth_type PASS 

     auth_pass 1111 

     } 

     virtual_ipaddress { 

     192.168.1.200 

     } 

     } 

virtual_server 192.168.237.200 3306 { 

     delay_loop 2 

     lb_algo wrr 

     lb_kind DR 

     persistence_timeout 60 

     protocol TCP 

     real_server 192.168.237.128 3306 { 

     weight 3 

     notify_down /usr/local/MySQL/bin/MySQL.sh 

     TCP_CHECK { 

     connect_timeout 10 

     nb_get_retry 3 

     delay_before_retry 3 

     connect_port 3306 

     } 

     } 

5.7.    编写检测服务down后所要执行的脚本

vi /usr/local/MySQL/bin/MySQL.sh 

 

#!/bin/sh  

pkill keepalived  

chmod +x /usr/local/MySQL/bin/MySQL.sh  

5.8.    启动keepalived  

/usr/local/keepalived/sbin/keepalived –D 

ps -aux | grep keepalived 

5.9.    MySQL远程登录测试

我们找一台安装有MySQL客户端的windows,然后登录VIP,看是否能登录,在登录之两台MySQL服务器都要授权允许从远程登录

MySQL> grant all privileges on *.* to 'root'@'%' identified by '123456'; 

MySQL> flush privileges;  

5.10. 使用客户端登录VIP测试

C:\MySQL\bin>MySQL.exe -uroot -p123456 -h192.168.1.200 -P3306 

Welcome to the MySQL monitor.  Commands end with ; or \g. 

Your MySQL connection id is 224  

Server version: 5.0.89-log Source distribution 

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. 

MySQL> 

5.11. keepalived故障转移测试

在windows客户端一直去ping  VIP,然后关闭192.168.237.127上的keepalived,正常情况下VIP就会切换到192.168.237.128上面去

开启192.168.237.127上的keepalived,关闭192.168.237.128上的keepalived,看是否能自动切换,正常情况下VIP又会属于192.168.237.127

注:keepalived切换速度还是非常块的,整个切换过程只需1-3秒

5.12. MySQL故障转移测试

在192.168.237.127上关闭MySQL服务,看VIP是否会切换到192.168.237.128上,开启192.168.237.127上的MySQL和keepalived,然后关闭192.168.237.128上的MySQL,看VIP是否会切换到192.168.237.127上。

下面是用windows客户端连接的MySQL的VIP,在切换时我执行了一个MySQL查询命令,从执行show databases到显示出结果时间为3-5秒(大家可以看到上面有个错误提示,不过不用担心,因为我们的keepalived切换大概为3秒左右,这3秒左右VIP是谁都不属于的)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

高可用mysql集群搭建(mysql5.6+keepalived) 的相关文章

  • DATAX 数据同步 My SQL->Hive

    DATAX 数据同步 My SQL gt Hive 安装 DATAX官方地址 https github com alibaba DataX DATAX WEB官方地址 https github com WeiYe Jing datax we

随机推荐

  • 在嵌入式设备中不创建swap分区的原因何在

    我们知道 在linux中有一个很重要的概念 虚拟内存 当物理内存不够时 可以将内存中一些数据存储到硬盘上 而让出物理内存 我们一般在PC上安装linux时 会创建一个swap分区 其大小一般设置为内存的2倍 而我们在嵌入式设备中 却看不到该
  • 面试时,如何向HR解释自己频繁跳槽?

    有数据显示 现在的职场人 跳槽越来越频繁 95后平均7个月就离职 对于面试官来说 一个跳槽过于频繁的人总是存在潜在风险 比如抗压力差 稳定性不好 心不定这山望着那山高 职业规划不清晰等等 我一直强调一个观点 职场人跳槽 应该是为了下一步有更
  • git配置用户名和密码_IDEA配置码云教程

    第一步 先在电脑上安装git exe 否则以后会出现错误 官方下载地址 https www git scm com downloads 官方中文教程 https git scm com book zh v2 点击自动下载 然后下载好后 选择
  • linux几种压缩命令的简单使用

    在CentOS 7中 常用的解压缩命令是tar gzip和bzip2 压缩命令是tar gzip bzip2和zip 以下是这些命令的使用方法 1 tar命令 tar是常用的归档和压缩工具 可以用来打包 压缩和解压文件 常用的选项有 c 创
  • 《深入浅出React和Redux》(1) - React基础

    create react app React技术依赖的技术栈比较多 比如 转译JavaScript代码需要使用Babel 模块打包工具要使用Webpack 定制build过程需要grunt或者gulp create react app命令可
  • 【Spring容器】项目启动后初始化数据的两种实践方案

    早期业务紧急 没有过多的在意项目的运行效率 现在回过头看走查代码 发现后端项目 Spring MVC MyBatis 在启动过程中多次解析mybatis的xml配置文件及初始化数据 对开发阶段开发人员反复启停项目造成很大的时间浪费 也即是下
  • java设计模式之享元模式通俗易懂

    什么是享元模式 为什么要使用享元模式 享元模式属于结构型设计模式 享元模式主要是为了解决大量对象创建后 增大了系统的资源开销 为了解决此问题 该模式通过共享对象的方式实现 既然是共享肯定有一定结构和策略 通俗易懂的举个例子 我们生活当中需要
  • C#元组学习笔记

    元组功能提供了简洁的语法来将多个数据元素分组成一个轻型数据结构 下面的示例演示了如何声明元组变量 对它进行初始化并访问其数据成员 double int t1 4 5 3 Console WriteLine Tuple with elemen
  • Vue-全局配置axios

    Vue 全局配置axios 1 安装axios npm i axios 2 在main js 引入axios import axios from axios 3 全局配置axios的请求根路径 axios defaults baseURL
  • OAuth原理,图文并茂,通俗易懂

    步骤2请求OAuth登录页 慕课的服务器请求腾讯服务器 步骤3使用第三方账号登录并授权 步骤4返回登录结果 拿到了加密后的code参数 有了code基本上可以确定 用户输入的QQ号和密码 是匹配的 也就是说登录是成功的 但还不够出于安全性的
  • 服务器磁盘如何新建文件夹,如何使用网络硬盘

    网络硬盘是将OA服务器上某一个已经存在的文件夹开放并允许用户通过IE进行共享访问 是一种重要的文件共享方式 类似于文件柜 又区别于文件柜 网络硬盘的存储是将OA服务器上的某个物理存在的文件夹 设置为网络硬盘 换言之 是将文件存储于服务器上特
  • Android TreeView 树形组织结构 带复选框

    之前做项目的时候做人员组织架构时候需要用到 同样可以用于目录视图 简单搜了一下没有合适的 只找到一个基础的有瑕疵的树形结构 就在基础上改了增加了复选框以及简化了部分代码 下面上演示效果图 时长25秒 手机卡见谅 复选框有两种设计模式 1 子
  • SpringBoot 更优雅的实现接口操作日志获取

    SpringBoot 更优雅的实现接口操作日志获取 使用注解 延迟到子类处理的方式实现解耦合 1 定义 Oplog 系统操作日志注解 author chenyusheng create 2023 6 28 9 56 description
  • 字符串系列题目(C++)

    参考链接 https leetcode cn com problems fan zhuan dan ci shun xu lcof solution yi ge mo ban shua bian suo you zi fu chu x6vh
  • 五大常用算法之二:动态规划算法

    一 基本概念 动态规划过程是 每次决策依赖于当前状态 又随即引起状态的转移 一个决策序列就是在变化的状态中产生出来的 所以 这种多阶段最优化决策解决问题的过程就称为动态规划 二 基本思想与策略 基本思想与分治法类似 也是将待求解的问题分解为
  • Spring基础入门2 - IoC容器

    在上文介绍了Spring IoC容器的基本用法 下面做一个稍微复杂点的例子 继续学习Spring的IoC和AoP的 实际 使用 我们假设有一个在线商城OnlineStore 在线商城需要提供一些银行相关服务 假设 因为银行服务的实现是容易变
  • Qt 基于元对象系统实现反射

    背景 C 不支持反射 但使用 Qt 的元对象系统可以实现反射机制 使用反射创建对象 概述 使用 Qt 的元对象系统 可以使用反射来创建对象 需要把构造函数用 Q INVOKABLE 进行标记 类定义示例 class demoClass pu
  • 微信小程序 全局路由拦截

    1 微信小程序 全局路由拦截 utils filter js function loginCheck pageObj if pageObj onLoad let onLoad pageObj onLoad 使用onLoad的话需要传递opt
  • synchronized关键字(一)

    一 线程安全和不安全 非线程安全 在多个线程对同一个对象的实例变量进行并发访问时会出现值被更改 值不同步的情况 线程安全 获得的实例变量的值是经过同步处理的 按照顺序执行 不会出现脏读情况 举个例子 5个销售员 卖同一堆货物 每个销售员在卖
  • 高可用mysql集群搭建(mysql5.6+keepalived)

    1 方案在一定程度上保证主库的高可用 在一台主库down掉之后 可以在极短的时间内切换到另一台从库上 尽可能减少主库宕机对业务造成的影响 1 一台主库 master 提供服务 只负责数据的写入 2 一台数据库服务器资源做master主库的从