mysql集群搭建_mysql高可用集群搭建

环境描述:

Centos6.5

主库:149

从库:148

数据库版本:mariadb-10.0.33

第一步:

安装数据库:

这里我采用的是二进制安装:

创建用户:

useradd -s /sbin/nologin -M mysql

初始化:

./scripts/mysql_install_db --basedir=/data/mariadb-10.0.33/ --datadir=/data/mariadb-10.0.33/data/ --user=mysql

拷贝配置文件:

cp support-files/my-innodb-heavy-4G.cnf /etc/my.cnf

编辑配置文件:

vim /etc/my.cnf

添加以下配置:

basedir=/data/mariadb-10.0.33-linux-x86_64

datadir=/data/mariadb-10.0.33-linux-x86_64/data

修改数据库目录所属:

chown -R mysql:mysql /data/TDserver/mariadb-10.0.33/

拷贝驱动脚本到系统目录:

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

启动数据库:

service mysqld start

新增用户并修改密码:

mysql> grant all privileges on . to 'root'@'%' identified by '密码';

mysql> grant all privileges on . to 'root'@'127.0.0.1' identified by '密码';

Query OK, 0 rows affected (0.00 sec)

刷新权限

mysql> flush privileges;

第二步:

配置数据库的主从复制:

先进行主库的配置:

说明:此处是接第一步步骤之后进行,配置文件的[mysqld]中新增或者修改以下配置

具体的需求安装自己的需要调整即可,此处只是给出环境的搭建步骤:

[mysqld]

#设置编码格式

#character-set-server=utf8

#设置主库配置

log-bin=master-bin

log-bin-index=master-bin.index

innodb_file_per_table=1

binlog_format=mixed

expire_logs_days=7

binlog-do-db=需要同步的数据库名称1

binlog-do-db=需要同步的数据库名称1

binlog-do-db=需要同步的数据库名称1

server-id = 185

slave_skip_errors=1062

#主从复制函数开关

log_bin_trust_function_creators=ON

#主库

#性能

innodb_flush_log_at_trx_commit = 0

innodb_buffer_pool_size = 8G

#lower_case_table_names=1

#以上需要定制化配置选项

配置完成之后,重启主库,继续进行下面的几步操作:

CREATE USER 'slave'@'从库IP地址' IDENTIFIED BY 'slavepass'; #创建用户

GRANT REPLICATION SLAVE ON . TO 'slave'@'从库IP地址';#分配权限

FLUSH PRIVILEGES;#刷新权限

SHOW MASTER STATUS;#查看master状态

SHOW PROCESSLIST \G #查看连接

FLUSH TABLES WITH READ LOCK;#锁定所有表

UNLOCK TABLES;#解锁表

下面开始从库的配置和操作:

配置文件的[mysqld]中新增或者修改以下配置:

#设置编码格式

#character-set-server=utf8

#设置从库配置

relay-log=relay-log

relay-log-index=relay-log.index

innodb_file_per_table=1

server-id = 101

slave_skip_errors=1062

#需要复制的库名

#主从复制函数开关

log_bin_trust_function_creators=ON

replicate_do_db=需要同步的数据库名1

replicate_do_db=需要同步的数据库名2

replicate_do_db=需要同步的数据库名3

修改完成之后要重启数据库生效

从库中进行以下操作:

连接主库:

CHANGE MASTER TO MASTER_HOST='主库IP地址',MASTER_USER='slave',MASTER_PASSWORD='slavepass',MASTER_LOG_FILE='master-bin.000005', MASTER_LOG_POS=1021;

5d11c6133aadc9af8e5da70794ce1f23.png

MASTER_LOG_FILE 对应 master-bin.000005

MASTER_LOG_POS对应194858

开始复制:

start slave;

停止复制:

stop slave;

修改心跳间隔为10s

change master to master_heartbeat_period = 10;

设置25s内没有数据传输则认为网络超时

set global slave_net_timeout = 25;

查看从库心跳状态

show status like 'slave%';

查看从库连接状态

show slave status\G

其中的Senconds_Behind_Master的值表示主从复制延时

参考配置链接:https://blog.csdn.net/JesseYoung/article/details/42914577

好的,到此为止数据库的主从复制已经完成,但是这样远远不能满足生产中对应应用高可用性的要求。

上面配置小伙伴们如果已经配置起来了,下面我们接着进行keepalived的相关配置,

如果你是安照最小化安装的,再解压安装执行之前请务必先安装以下依赖:

yum -y install openssl-devel

下面我们进行标准的三步曲就可以了:

tar -zxvf keepalived-1.3.7.tar.gz

./configure

make && make install

若无报错说明已经安装完成,若是有报错的伙伴百度相关的错误,应该就可轻松解决。

下面是很重要的几步操作,操作时要看清楚:

我们首先在/etc 目录下创建keepalived目录

mkdir /etc/keepalived

进入到解压的软件包目录(你下载的软件所在目录),不是编译安装的目录

使用 tree -l 命令可以看到以下文件

9c2ae9264dcc8141149b28bbb4eef8f8.png

分别拷贝到系统的目录下(我的安装包存放在/usr目录下执行命令即可):

cp /usr/keepalived-1.3.7/keepalived/etc/init.d/keepalived /etc/init.d/

cp /usr/keepalived-1.3.7/keepalived/etc/sysconfig/keepalived /etc/sysconfig/

cp -r /usr/keepalived-1.3.7/keepalived/etc/keepalived/keepalived.conf /etc/keepalived

进入到keepalived的安装目录,默认是/usr/local/keepalived

cp /usr/local/keepalived/sbin/keepalived /usr/sbin/

以上一共是拷贝四个文件分别到系统的目录中,

启动测试:

service keepalived start

正常启动会有三个进程

7d65eb72c28f274ddddf9374dd0bbd53.png

若是可以正常启动表示已经完成了大半(主库和从库都要安装上),相关的配置文件和脚本下面会给出,小伙伴们直接拿来使用就行

keepalived.conf(主)

! Configuration File for keepalived

global_defs {

notification_email {

**@163.com

}

notification_email_from yuchao_cacti@163.com

smtp_server smtp.163.com

smtp_connect_timeout 30

router_id LVS_DEVEL

vrrp_skip_check_adv_addr

vrrp_strict

vrrp_garp_interval 0

vrrp_gna_interval 0

}

vrrp_script check_run {

script "/home/sh/check_mysql.sh"

interval 5

}

vrrp_instance VI_1 {

state MASTER

interface eth0

virtual_router_id 51

priority 100

advert_int 1

authentication {

auth_type PASS

auth_pass 1111

}

virtual_ipaddress {

200.200.6.155/24 dev eth0 label eth0:0

}

track_script {

check_run

}

notify_master /home/sh/close_iptables.sh

notify_backup /home/sh/close_iptables.sh

}

virtual_server 虚拟IP 3306 {

delay_loop 2

lb_algo wrr

lb_kind DR

persistence_timeout 60

protocol TCP

real_server 主库IP 3306 {

weight 3

TCP_CHECK {

connect_timeout 10

nb_get_retry 3

delay_before_retry 3

connect_port 3306

}

}

}

以上需要注意几个地方:

keepalived.conf(从)

! Configuration File for keepalived

global_defs {

notification_email {

**@163.com

}

notification_email_from **@163.com

smtp_server smtp.163.com

smtp_connect_timeout 30

router_id LVS_DEVEL

vrrp_skip_check_adv_addr

vrrp_strict

vrrp_garp_interval 0

vrrp_gna_interval 0

}

vrrp_script check_run {

script "/home/sh/check_mysql.sh"

interval 5

}

vrrp_instance VI_1 {

state BACKUP

interface eth0

virtual_router_id 51

priority 99

advert_int 1

authentication {

auth_type PASS

auth_pass 1111

}

virtual_ipaddress {

虚拟IP/24 dev eth0 label eth0:0

}

track_script {

check_run

}

notify_master /home/sh/close_iptables.sh

notify_backup /home/sh/close_iptables.sh

}

virtual_server 虚拟IP 3306 {

delay_loop 2

lb_algo wrr

lb_kind DR

persistence_timeout 60

protocol TCP

real_server 从库IP 3306 {

weight 3

TCP_CHECK {

connect_timeout 10

nb_get_retry 3

delay_before_retry 3

connect_port 3306

}

}

}

从库设置注意的地方:

priority 99 这个值要比主库小

state 这个值要为BACKUP

virtual_router_id 51 这个值要和主一致

check_mysql.sh mysql检查脚本:

#!/bin/bash

MYSQL=/usr/bin/mysql

MYSQL_HOST=localhost

MYSQL_USER=数据库用户名

MYSQL_PASSWORD=数据库密码

CHECK_TIME=3

#mysql is working MYSQL_OK is 1 , mysql down MYSQL_OK is 0

MYSQL_OK=1

function check_mysql_health (){

$MYSQL -h $MYSQL_HOST -u $MYSQL_USER -p$MYSQL_PASSWORD -e "show status;" >/dev/null 2>&1

if [ $? = 0 ] ;then

MYSQL_OK=1

else

MYSQL_OK=0

fi

return $MYSQL_OK

}

while [ $CHECK_TIME -ne 0 ]

do

let "CHECK_TIME-=1" ##(小提示这里我们采用的是let进行整数的运算当然您可以用expr,感觉let省去了$比较方便)

check_mysql_health

if [ $MYSQL_OK = 1 ] ; then

CHECK_TIME=0

exit 0

fi

if [ $MYSQL_OK -eq 0 ] && [ $CHECK_TIME -eq 0 ]

then

/etc/init.d/keepalived stop

exit 1

fi

sleep 1

done

close_iptables.sh 关闭防火墙:

#! /bin/bash

/etc/init.d/iptables stop

restart_jboss.sh 重启远程服务器上的jboss

#! /bin/bash

#重启远程jboss服务器

/usr/bin/ssh root@远程IP "/bin/sh /home/sh/restart_jboss.sh"

远程服务器上脚本:

#! /bin/bash

#重启jboss

/sbin/service jboss-eap-5Fdating restart

配置完成之后验证测试,若是遇到相关问题可以留言,或者自行搜索即可。

看似我们的数据库已经达到生产的要求了,但还是不行,我们对主从同步的数据并不能进行有效的监控,所以我们还需要部署一个监控主从同步状态的程序, percona-toolkit 闪亮登场,下面我们接着进行percona-toolkit的相关配置。

我们首先先安装好相关的依赖程序:

mysql> GRANT SELECT, PROCESS, SUPER, REPLICATION SLAVE,CREATE,DELETE,INSERT,UPDATE ON *.* TO 'checksum'@'200.200.6.%' identified by '123456';

mysql> flush privileges;

检测生成checksum表文件

pt-table-checksum --host=主库IP --port=3306 --user=checksum --password=123456 --databases=需要检查的库名 --create-replicate-table --replicate=需要检查的库名.checksums --no-check-binlog-format --nocheck-replication-filters

修复主从不同步的数据:

pt-table-sync --replicate=被检测的数据库名.checksums h=主库IP,u=root,p=123456 h=从库IP,u=root,p=123456 --print --charset=utf8

--print :打印,但不执行命令。

--execute :执行命令。

#自动检测数据是否一致脚本(进行对应修改即可使用)

#! /bin/bash

NUM=$(/usr/bin/pt-table-checksum --nocheck-replication-filters --no-check-binlog-format --replicate=huanqiu.checksums --databases=huanqiu  h=192.168.1.101,u=root,p=123456,P=3306|awk -F" " '{print $3}'|sed -n '2p')

if [ $NUM -eq 1 ];then

/usr/bin/pt-table-sync --replicate=huanqiu.checksums h=192.168.1.101,u=root,p=123456 h=192.168.1.102,u=root,p=123456 --print

/usr/bin/pt-table-sync --replicate=huanqiu.checksums h=192.168.1.101,u=root,p=123456 h=192.168.1.102,u=root,p=123456 --execute

else

echo "data is ok"

fi

到此整个数据库集群环境搭建完成,感谢各位浏览和指正,谢谢!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值