Keepalived: v1.2.13
Linux:centos x64 6.8版本
Mycat:1.5.1版本
Mysql:5.6.21版本
nc: 1.84-24
ipvsadm: 1.26-4
jdk:1.7
架构介绍:
四台主机:
Master:192.168.118.128
Slave:192.168.118.129
DBMaster:192.168.118.130
DBSlave:192.168.118.131
虚拟ip:192.168.118.16
端口:8066
流程图:
问题1:tar.gz包解压后,进入解压后的文件,执行./scripts/mysql_install_db --user=mysql。提示bash:scripts/mysql_install_db: /usr/bin/perl: bad interpreter: No such file ordirectory?
解决方案:貌似提示注释器错误,没有/usr/bin/perl文件或者档案,解决办法(安装perl跟perl-devel即可):
执行 yum-y install perl perl-devel
后在执行./scripts/mysql_install_db --user=mysql初始化数据库即可。
安装Mysql:
查看下是否有系统自带mysql的rpm包,如果有,需要删除自带的旧rpm包。
[root@linuxidc ~]#rpm -qa | grep mysql
mysql-libs-5.1.71-1.el6.x86_64
[root@linuxidc ~]# yum-y remove mysql-libs-5.1*
[root@linuxidc ~]# rpm-qa | grep mysql
[root@linuxidc ~]#
在MySQL官网下载安装MySQL-5.6.21所需的rpm软件包。
需要下载三个rpm软件包:
MySQL-client-5.6.21-1.rhel5.x86_64.rpm
MySQL-devel-5.6.21-1.rhel5.x86_64.rpm
MySQL-server-5.6.21-1.rhel5.x86_64.rpm
[root@linuxidc ~]
wgethttp://dev.mysql.com/Downloads/MySQL-5.6/MySQL-server-5.6.21-1.rhel5.x86_64.rpm
wgethttp://dev.mysql.com/Downloads/MySQL-5.6/MySQL-devel-5.6.21-1.rhel5.x86_64.rpm
wget http://dev.mysql.com/Downloads/MySQL-5.6/MySQL-client-5.6.21-1.rhel5.x86_64.rpm
rpm -ivhMySQL-server-5.6.21-1.rhel5.x86_64.rpm
rpm -ivhMySQL-server-5.6.21-1.rhel5.x86_64.rpm
rpm -ivhMySQL-client-5.6.21-1.rhel5.x86_64.rpm
修改配置文件位置。
[root@linuxidc tools]# cp /usr/share/mysql/my-default.cnf /etc/my.cnf
初始化MySQL及修改MySQL默认的root密码。
[root@linuxidc tools]# /usr/bin/mysql_install_db
[root@linuxidc tools]# ps -ef | grep mysql
执行完之后启动 mysql:
Service mysqlstart;
查询root密码登陆:
more/root/.mysql_secret
# Therandom password set for the root user at Thu Apr 9 14:43:59 2015 (localtime): F6K3v_xggFoLQeiN
[root@linuxidc tools]# mysql -uroot -pF6K3v_xggFoLQeiN
Warning: Using a password on the command lineinterface can be insecure.
Welcome to the MySQL monitor. Commandsend with ; or \g.
修改root密码;
mysql> usemysql;
mysql> UPDATEuser SET Password = PASSWORD(“******”) WHERE user = 'root';
在mysql主从两台机器上打开vi /etc/my.cnf文件,在mysqld下加一行:
lower_case_table_names =1
Myql主从复制的搭建:
两台机器192.168.18.130(master) 192.168.118.31(slave)
先从master开始:
1. 打开/etc/my.cnf文件(mysql启动默认是从/etc/my.cnf读取的,所以你别的地方有配置文件的话建议直接移到/etc目录下)
2. 在[mysqld]下加入配置:
## replication
server_id=6
binlog-ignore-db=mysql
log-bin=master-mysql-bin
binlog_cache_size=1M
binlog_format=mixed
expire_logs_days=7
slave_skip_errors=1062
(serverid 全局唯一的
binlog-ignore-db=mysql复制过滤,我们不同步mysql系统自带的数据库
log-bin=master-mysql-bin开启logbin功能并设置logbin文件的名称
binlog_format=mixed 混合型复制模式,默认采用基于语句的复制,一旦发现基于语句的无法精确的复制时,就会采用基于行的复制。
接下来重启mysql服务并用客户端登录)
3. Slave想要同步master上的数据首先肯定需要权限,所以我们要在master上开通权限。
grant replication slave, replication client on *.* to'root'@'192.168.118.131' identified by ‘密码’;(不知道这句有没有用,我自己是开启了任何ip都可以链接master的权限,不建议在服务器上这样做)
或者自己开启slave服务器链接master服务器的权限
刷新授权信息,查看master状态:
Flush privileges;
Show master status;
-------------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB |Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------------+----------+--------------+------------------+-------------------+
| master-mysql-bin.000001 | 1160 | | mysql |
4. 在master上创建一个数据库,
我这里直接用的test库,
在库里创建一张表user,
Create table user(
User_id int(10) primary keyauto_increment,
User_name varchar(10)
);
随便插入几条数据。
接下来我们把test这个库的数据全部备份下来,
首先我们要锁表,
Flush tables with read lock;
接下来用mysql的备份命令进行备份,(不知道这一步可不可以省略,没试过)
Mysqldump –p3306 –uroot –p –add-drop-tabletest > /tmp/edu-master.sql
然后把sql文件用xftp发送到slave服务器上
5. Slave的配置:
打开配置文件/etc/my.cnf
在[mysqld]下加入:
## replication
server_id=5
binlog-ignore-db=mysql
log-bin=mysql-slave-bin
binlog_cache_size = 1M
binlog_format=mixed
expire_logs_days=7
slave_skip_errors=1062
relay_log=mysql-relay-bin
log_slave_updates=1
read_only=1
然后重启mysql:
Service mysql restart
然后创建一下数据库,因为备份下来的数据文件里面是不包含创建数据库命令的,所以要手动创建一下,(这里我用的是test数据库,所以不用自己创建,如果在master上是自己创建的数据库,这里需要在slave上在创建一次,省略)
把从master哪里备份过来的sql文件恢复到slave中
mysql –uroot –p test < /tmp/edu-master.sql
6. 登陆slave数据库
在mysql中输入命令链接master:
change master tomaster_host='192.168.118.130',master_user='root',master_password=”******”,master_port=3306,master_log_file='master-mysql-bin.000001',master_log_pos=1160,master_connect_retry=30;
change
master to
master_host='192.168.118.130' #master主机的ip地址
master_user='root',
master_password=’******’,
我们刚刚在master有执行过授权的账号密码就是这个
master_port=3306,master数据库的端口号
master_log_file= ‘master-mysql-bin.000001', #show master status 看到的
master_log_pos=1160, #这个是我们通过show masterstatus看到的position
master_connect_retry=30;
使用命令查看slave状态,可以看到slave目前还未开始同步
show slave status\G;
执行strat slave 开始主从同步,看到两个Yes就代表成功了。
在master机器上查看状态,可以看见slave的链接信息。
Showprocesslist\G
最后可以测试一下,在master中插入数据,去slave查看数据是否已经插入。
安装1.7版本java
rpm -ivhjdk-7u80-linux-x64.rpm
安装完成后java –version查看版本,是否安装成功。反正我安装成功了。
OpenJDK Runtime Environment(rhel-2.6.10.1.el6_9-x86_64 u141-b02)
OpenJDK 64-Bit Server VM (build 24.141-b02,mixed mode)
将mycat的安装包解压到/usr/local目录下,
cd /usr/local/mycat
ll
设置Mycat的环境变量
Vi /etc/profile
加入两行;
export MYCAT_HOME=/usr/local/mycat
export PATH=$PATH:$MYCAT_HOME/bin
使配置文件立即生效,
source /etc/profile
进入mycat配置文件目录:
cd /usr/local/mycat/conf/
vi schema.xml
这个配置文件主要是用来配置数据库节点,逻辑表等等东西的:
writeType="0" dbType="mysql"dbDriver="native" switchType="2"slaveThreshold="100">
接下来配置server.xml文件:
vi server.xml
如下:
关闭防火墙:
Service iptables stop
开启Mycat:
Mycat start
用navicat连接Mycat进行查询和新增,mycat默认端口是8066,
查看Mycat.log日志,查看路由是否正确.
注意:mycat.log日志默认是info级别,要在mycat/conf/log4j.xml中修改日志级别为debug之后再看。
在web服务器上/etc/init.d下新建realserver脚本(两个都要)。内容如下:
SNS_VIP=192.168.118.16 #虚拟ip(集群虚拟ip要相同)
/etc/rc.d/init.d/functions
case "$1" in
start)
ifconfig lo:0 $SNS_VIP netmask255.255.255.255 broadcast $SNS_VIP
/sbin/route add -host $SNS_VIP dev lo:0
echo "1">/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2">/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2">/proc/sys/net/ipv4/conf/all/arp_announce
sysctl -p >/dev/null 2>&1
echo "RealServer Start OK"
;;
stop)
ifconfig lo:0 down
route del $SNS_VIP >/dev/null2>&1
echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "0">/proc/sys/net/ipv4/conf/lo/arp_announce
echo "0">/proc/sys/net/ipv4/conf/all/arp_ignore
echo "0">/proc/sys/net/ipv4/conf/all/arp_announce
echo "RealServer Stoped"
;;
*)
echo "Usage: $0 {start|stop}"
exit 1
esac
exit 0
然后service realserver start启动realserver
如果报权限不够,则赋予realserver相应权限:chmod 755 /etc/init.d/realserver
如果访问function被拒绝,则赋予functions相应权限:chmod 755 /etc/rc.d/init.d/functions
(keepalived+ipvsadm不是装在mycat+mysql服务器上,准备一个新的服务器,单独放keepalived+ipvsadm)
安装keepalived之前首先安装nc插件。用来对Mycat的8066端口做心跳检测。
直接用rpm -ivh nc-1.84-24.el6.x86_64.rpm安装就可以用。
安装keepalived:(主从负载均衡服务器都要配置)
rpm -ivhkeepalived-1.2.13-5.el6_6.x86_64.rpm
配置keepalived.conf:
1. global_defs {
2. notification_email {
3. root@localhost
4. }
5. notification_email_from root@localhost
6. smtp_server localhost
7. smtp_connect_timeout 30
8. router_id NodeA
9. }
默认的配置文件中,使用第三方smtp服务器,但这在现实中几乎没有意义(需要验证的原因),我们将其指定为localhost, 将通知信息的发送交给本地sendmail服务处理。查阅说明文档得知route_id配置是为了标识当前节点,我将其设置为NodeA。
1. vrrp_instance VI_1 {
2. state MASTER #指定A节点为主节点 备用节点上设置为BACKUP即可
3. interface eth0 #绑定虚拟IP的网络接口
4. virtual_router_id 51 #VRRP组名,两个节点的设置必须一样,以指明各个节点属于同一VRRP组
5. priority 100 #主节点的优先级(1-254之间),备用节点必须比主节点优先级低
6. advert_int 1 #组播信息发送间隔,两个节点设置必须一样
7. authentication { #设置验证信息,两个节点必须一致
8. auth_type PASS
9. auth_pass 1111
10. }
11. virtual_ipaddress { #指定虚拟IP, 两个节点设置必须一样。
12. 192.168.118.16 #测试过程中发现,该虚拟ip只有和真实ip在同一网段,才好用
13. #不知道是不是跟我的虚拟机用的nat模式联网有关。
14. #测试主机A节点ip为192.168.118.128
15. }
16.}
按同样的方法配置节点B并修改配置文件,可将A节点的配置文件复制到B节点,并修改以下几项:
router_id NodeB
state BACKUP
priority 90
执行命令 ip a (注意ifconfig命令无法查看到配置的虚拟IP),可以看到节点A已经绑定了192.168.118.16的ip,此时,关闭A的keepalived,在节点B上上执行ip a就发现虚拟IP已经绑定到节点B上,再开启A的keepalived,虚拟IP又绑定回节点A之上。
Keepalived.conf完整配置如下:(两个负载均衡服务器都要配置)
! ConfigurationFile for keepalived
global_defs {
notification_email{
root@localhost
}
notification_email_from root@localhost
smtp_server localhost
smtp_connect_timeout 30
router_id NodeA
}
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 {
192.168.118.16
}
}
virtual_server 192.168.118.168066 { #虚拟ip
delay_loop 6
lb_algo rr
lb_kind DR
nat_mask 255.255.255.0
persistence_timeout0 #会话保持时间,x s之内用户无相应则下一次用户请求时重新
#路由
protocol TCP
real_server 192.168.118.130 8066 { #真实服务器1
weight 1
MISC_CHECK {
misc_path"/etc/keepalived/check_mycat_status.sh 192.168.118.130 8066"
misc_timeout 3
}
}
real_server 192.168.118.131 8066 { #真实服务器2
weight 1
MISC_CHECK {
misc_path"/etc/keepalived/check_mycat_status.sh 192.168.118.131 8066"
misc_timeout 3
}
}
}
说明:因为用tcp_check健康检测后面的mycat会报错,所以这里用misc_check的方式做心跳检测,misc_path引号中内容分别是:自定义心跳检测shell脚本的路径、检测的服务器ip、检测的端口。(引号必须要)
Misc_timeout是脚本执行超时时间。
Misc自定义脚本如下:(执行下列脚本必须要安装nc插件)
创建脚本:
vi check_mycat_status.sh
脚本内容:
#!/bin/bash
result=`nc -v -z $1 $2`
flag="succeeded"
if [[ $result =~ $flag ]]
then
exit 0
else;
exit 1
fi
给该脚本赋予执行权限:
Chmod 755 check_mycat_status.sh
Ipvsadm安装:(两个负载均衡服务器都要配置)
rpm -ivhipvsadm-1.26-4.el6.x86_64.rpm检查安装是否成功:
Ipvsadm –help
用ipvsadm –L查看Keepalived路由信息。
用navicat链接虚拟ip 192.168.118.16 端口号8066,用户名root,密码******,
通过Keepalived服务器转发到两台数据库服务器的Mycat上,ip地址为192.168.118.130和192.168.118.131,端口号为8066。连上mycat服务器后,通过mycat对master数据库进行写,对slave数据库进行读操作。Master的数据会更新到slave数据库。
Mysql的安装的主从复制的配置,
双点Mycat读写分离的安装配置
分流服务器主从Keepalived+ipvsadm的安装、配置和数据库服务器realserver脚本的编写