[root@hadoop101 /]rpm -qa|grep mysql
[root@hadoop101 /]rpm -e --nodeps mysql****
useradd -r(建立系统帐号) -g(用户所属组) mysql(用户组) mysql(用户)
2.解压mysql
[root@hadoop101 /]cd /usr/local
[root@hadoop101 local]tar -zxvf mysql-5.6.46-linux-glibc2.12-x86_64.tar.gz
3.修改/etc/profile环境变量
[root@hadoop101 local]vim /etc/profile
最后一行加入:export PATH=$PATH:/usr/local/mysql/bin
[root@hadoop101 local]source /etc/profile
修改了/etc/profile环境变量,就不用每次都进入/usr/local/mysql/bin/mysql来启动客户端了。
4.创建软链接
[root@hadoop101 local]ln -s mysql-5.6.46-linux-glibc2.12-x86_64 mysql
ln -s(对源文件建立符号连接) 源文件 目标文件
Linux具有为一个文件起多个名字的功能,称为链接。被链接的文件可以存放在相同的目录下,但是必须有不同的文件名,而不用在硬盘上为同样的数据重复备份。说直白点,就是为文件重新起个新的名字,访问新名字和旧名字具有同样的效果。
5.创建修改mysql用户和组
[root@hadoop101 local]cd mysql
[root@hadoop101 mysql]groupadd mysql
[root@hadoop101 mysql]useradd -r -g mysql mysql
[root@hadoop101 mysql]chown -R mysql:mysql ./
6.执行mysql_install_db脚本
[root@hadoop101 mysql]scripts/mysql_install_db --user=mysql
对mysql中的data目录进行初始化并创建一些系统表格,(5.7.*以上版本:bin/mysqld --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --initialize)。如果mysql的安装目录不是/usr/local/mysql,那么还必须指定basedir(mysql安装目录)和datadir(data所在路径)目录参数。
7.复制my.cnf配置文件、mysqld脚本
[root@hadoop101 mysql]cp support-files/my-default.cnf /etc/my.cnf
[root@hadoop101 mysql]cp support-files/mysql.server /etc/init.d/mysqld
有时候/etc目录下没有my.cnf文件,这就需要我们手动把默认配置文件移动到/etc目录下。
/etc/init.d/目录下有系统启动、关闭脚本,把mysql.server文件移动并重命名为mysqld放到该目录下,就可以使用service mysqld start/stop/status/restart 启动/关闭/状态/重启mysql。
1.开启mysql服务
[root@hadoop101 mysql]service mysqld start
[root@hadoop101 mysql]ps -ef|grep mysql
2.修改密码
[root@hadoop101 mysql]mysql
mysql> set password=password('123456');
mysql> quit;
3.设置无主机登录
[root@hadoop101 mysql]mysql -uroot -p123456
mysql> use mysql;
mysql> update user set host='%' where host='localhost';
mysql> flush privileges;
host=’%'意思是所有主机都可以登录mysql客户端,并不是只有宿主机才可以,flush privileges是让修改生效。
[root@hadoop102 /]rpm -qa|grep mysql
[root@hadoop102 /]rpm -e --nodeps mysql****
1.安装mysql服务端
[root@hadoop102 /]# rpm -ivh MySQL-server-5.6.24-1.el6.x86_64.rpm
2.查看产生的随机密码
[root@hadoop102 /]# cat /root/.mysql_secret
3.查看mysql状态
[root@hadoop102 /]# service mysql status
4.启动mysql
[root@hadoop102 /]# service mysql start
1.安装mysql客户端
[root@hadoop102 /]# rpm -ivh MySQL-client-5.6.24-1.el6.x86_64.rpm
2.连接mysql
[root@hadoop102 /]# mysql -uroot -p
3.修改密码
mysql> set password=password('123456');
4.退出mysql
mysql> quit;
1.修改user表,把Host表内容修改为%
mysql> use mysql;
mysql> update user set host='%' where host='localhost';
2.刷新生效
mysql> flush privileges;
1.修改配置文件/etc/my.cnf,添加如下配置:
#开启二进制日志
log-bin=mysql-bin
#标识唯一id
server-id =1
#不同步的数据库,可设置多个
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema
binlog-ignore-db=mysql
binlog-ignore-db=test
#指定需要同步的数据库(和slave是相互匹配的),可以设置多个
binlog-do-db=metastore
binlog-do-db=rdd
2.配置完成重新启动Master数据库:
[root@hadoop103 /]service mysql restart
3.进入mysql客户端,并查看主机状态,File和Position对应的值从机要用到:
------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 120 | | | |
+------------------+----------+--------------+------------------+-------------------+
[root@hadoop103 /]mysql -uroot -p
mysql> show master status;
4.分配一个数据库账号给Slave从数据库:
mysql> grant replication slave on *.* to 'slave'@'%' identified by '123456';
1.修改配置文件/etc/my.cnf,添加如下配置:
#开启二进制日志
log-bin=mysql-bin
#标识唯一id
server-id =2
#不同步的数据库,可设置多个
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema
binlog-ignore-db=mysql
binlog-ignore-db=test
#指定需要同步的数据库(和slave是相互匹配的),可以设置多个
binlog-do-db=metastore
binlog-do-db=rdd
2.配置完成重新启动Slave数据库:
[root@hadoop104 /]service mysql restart
3.执行同步SQL语句:
[root@hadoop104 /]mysql -uroot -p123456
mysql> change master to master_host='主机IP',master_user='slave',master_password='123456',master_port=3306,master_log_file='file的值',master_log_pos=position的值;
4.开启SQL线程并查看从服务器状态:
mysql> start slave;
mysq> show slave status\G
如果Slave_IO_Running、Slave_SQL_Running 的值都为YES,表明配置成功,若其中任意一个不是YES都说明同步失败。
1.在主数据库建一个test001数据库。
mysql> create database test001;
2.在从数据库查看是否有test001,如果有则证明同步成功。
mysql> show databases;
特别注意:如果Slave_SQL_Running 的值都为No,解决方案:
利用show slave status\G查看slave上具体报错信息,基本上会显示表不存在,或者表是大写之类的错误,具体问题具体分析。如果是区分大小写,则mysql配置:vim
/etc/mysql/my.cnf文件下设置lower_case_table_names=1(0区分大小写;1不区分大小写),设置完重启mysql1.在slave上停止同步:stop slave;
2.在master上重新查看file和position的值show master status;
3.在slave上把第2步的两个值复制过来:change master to master_host=‘主机IP’,master_user=‘slave’,master_password=‘123456’,master_port=3306,master_log_file=‘file的值’,master_log_pos=position的值;
4.在slave上开启同步:start slave;
5.在slave上开启同步,Slave_IO_Running、Slave_SQL_Running 的值都为YES,则成功:show slave status\G
主从ip以及虚拟ip:
master | slave | vip | |
---|---|---|---|
ip | 192.168.1.50 | 192.168.1.51 | 192.168.1.100 |
yum安装: yum install -y keepalived
启动.关闭.状态.重启: systemctl start/stop/status/restart keepalived.service
设置开机自动启动: systemctl enable keepalived.service
取消开机自动启动: systemctl disable keepalived.service
master配置
#master
global_defs {
smtp_server 192.168.1.50 #当前主机
smtp_connect_timeout 30
router_id MYSQL-HA #表示运行keepalived服务器的一个标识
}
vrrp_script check_mysql {
script "/usr/local/bin/check_mysql.sh"
interval 22
weight 2
}
vrrp_instance VI_1 {
state BACKUP #两台配置此处均是BACKUP,设为BACKUP将根据优先级决定主或从
interface eth0 #绑定的网卡
virtual_router_id 66 #虚拟路由标识,这个标识是一个数字(取值0-255之间)确保和slave相同,同网内不同集群此项必须不同,否则发生冲突。
priority 100 #用来选举master的,(取值0-255之间),此处slave上设置为90
advert_int 1 #多久进行一次master选举(可以认为是健康查检时间间隔)
nopreempt #不抢占,即允许一个priority比较低的节点作为master
authentication {
auth_type PASS #认证区域
auth_pass 1111
}
track_script {
check_mysql #指定核对的脚本,check_mysql是上述自定义的
}
virtual_ipaddress {
192.168.1.100 #虚拟ip,如果master宕机,虚拟ip会自动漂移到slave上
}
}
slave配置
#slave
global_defs {
smtp_server 192.168.1.51 #当前主机
smtp_connect_timeout 30
router_id MYSQL-HA #表示运行keepalived服务器的一个标识
}
vrrp_script check_mysql {
script "/usr/local/bin/check_mysql.sh"
interval 22
weight 2
}
vrrp_instance VI_1 {
state BACKUP #两台配置此处均是BACKUP,设为BACKUP将根据优先级决定主或从
interface eth0 #绑定的网卡
virtual_router_id 66 #虚拟路由标识,这个标识是一个数字(取值0-255之间)确保和master相同,同网内不同集群此项必须不同,否则发生冲突。
priority 90 #用来选举master的,(取值0-255之间),此处master上设置为100
advert_int 1 #多久进行一次master选举(可以认为是健康查检时间间隔)
nopreempt #不抢占,即允许一个priority比较低的节点作为master
authentication {
auth_type PASS #认证区域
auth_pass 1111
}
track_script {
check_mysql #指定核对的脚本,check_mysql是上述自定义的
}
virtual_ipaddress {
192.168.1.100 #虚拟ip
}
}
check_mysql.sh脚本
#!/bin/bash
if [ $(ps -C mysqld --no-header | wc -l) -eq 0 ]; then
service mysqld restart
fi
sleep 2
if [ $(ps -C mysqld --no-header | wc -l) -eq 0 ]; then
systemctl stop keepalived.service
fi
启动keepalived: systemctl start keepalived.service
设置开机自动启动: systemctl enable keepalived.service
查看keepalived进程: ps -ef|grep keepalived
查看masterip是否绑定: ip addr
在maser上启动keepalived,虚拟ip只能绑定一个ip,要么是master,要么是slave。
如果ip addr显示下面内容时,则绑定成功。
eth0: ,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
link/ether 28:6e:d4:88:c6:5e brd ff:ff:ff:ff:ff:ff
inet 192.168.1.51/24 brd 172.16.4.255 scope global eth0
valid_lft forever preferred_lft forever
inet 192.168.1.100/32 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::9cf2:98b1:9790:e3da/64 scope link
valid_lft forever preferred_lft forever
1.测试master节点挂断后,mysql服务是否重启:
master:
service mysqld stop
ps -ef|grep mysql
root 22868 2250 0 15:06 pts/0 00:00:00 grep mysql
vip:
mysql> show variables like 'server_id';
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id: 8
Current database: *** NONE ***
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id | 1 |
+---------------+-------+
1 row in set (0.03 sec)
ps -ef|grep mysql
root 29127 23269 0 15:01 pts/1 00:00:00 grep --color=auto mysql
root 97486 93113 0 11:43 pts/0 00:00:00 mysql -uroot -px xxxxxxxxxxx
root 120328 1 0 12:42 ? 00:00:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --datadir=/usr/local/mysql/data --pid-file=/usr/local/mysql/data/localhost.localdomain.pid
mysql 120687 120328 0 12:42 ? 00:00:44 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=/usr/local/mysql/data/localhost.localdomain.err --pid-file=/usr/local/mysql/data/localhost.localdomain.pid --socket=/var/lib/mysql/mysql.sock --port=3306
发现master关闭mysql服务后,立马调用mysql_check.sh脚本,重启mysql服务。
2.测试master节点挂断后,vip能否自动切换到slave:
master:
systemctl stop keepalived.service
ps -ef|grep keepalived
root 22891 2250 0 15:11 pts/0 00:00:00 grep keepalived
service mysqld stop
ps -ef|grep mysql
root 22868 2250 0 15:06 pts/0 00:00:00 grep mysql
vip:
mysql> show variables like 'server_id';
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id: 8
Current database: *** NONE ***
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id | 2 |
+---------------+-------+
1 row in set (0.03 sec)
slave:
ip addr
eth0: ,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
link/ether 28:6e:d4:88:c6:5e brd ff:ff:ff:ff:ff:ff
inet 192.168.1.52/24 brd 172.16.4.255 scope global eth0
valid_lft forever preferred_lft forever
inet 192.168.1.100/32 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::9cf2:98b1:9790:e3da/64 scope link
valid_lft forever preferred_lft forever
发现master关闭mysql和keepalived服务后,立马调用slave的mysql_check.sh脚本,ip自动漂移到slave。
vi /etc/resolv.conf
确定设置了域名服务器(ipconfig/all找出dns), 没有的话, 建议设置Google的公共DNS服务, 它应该不会出问题的
加入下面配置:
nameserver 8.8.8.8
nameserver 8.8.4.4
临时和永久关闭SELINUX
1.临时关闭:
[root@localhost ~]# getenforce
Enforcing
[root@localhost ~]# setenforce 0
[root@localhost ~]# getenforce
Permissive
2.永久关闭:
[root@localhost ~]# vim /etc/sysconfig/selinux
SELINUX=enforcing 改为 SELINUX=disabled
重启服务 reboot
查看keepalived日志: tail -f /var/log/message
查看日志显示virtual_router_id冲突,重新改个数字,然后重启keepalived服务