高可用MYSQL学习之路(一)——环境搭建&mysql复制

1.资源概述

由于实验室机器太少,手上只有一个服务器和自己的小笔记本,一直想玩玩这种感觉高大上的mysql集群,今天终于下定决心进行。


在这里,我遇到了两个问题,先给大家阐述一下,希望能帮助大家



一台机器里面如何装多个mysql 为复制而创建的用户不能本地登录


下面围绕这两个问题进行解决。

2.如何在一台机器里面安装多个mysql

显然这个是开多个mysql的实例,只是对应着不同的端口就可以轻松达成。


下面讲讲我的做法。


1. 下载mysql源码,我这里下载的是mysql5.5.32的


2. 使用牛叉的cmake、make、make install进行安装


安装第一个实例mysql1


首先cmake



cmake \
-DCMAKE_INSTALL_PREFIX=/data/mysql1 \ #安装路径
-DMYSQL_DATADIR=/data/mysql1/data \ #数据文件存放位置
-DSYSCONFDIR=/etc \ #my.cnf路径
-DWITH_MYISAM_STORAGE_ENGINE=1 \ #支持MyIASM引擎
-DWITH_INNOBASE_STORAGE_ENGINE=1 \ #支持InnoDB引擎
-DWITH_MEMORY_STORAGE_ENGINE=1 \ #支持Memory引擎
-DWITH_READLINE=1 \ #快捷键功能(我没用过)
-DMYSQL_UNIX_ADDR=/data/mysql1/mysql1.sock \ #连接数据库socket路径
-DMYSQL_TCP_PORT=3306 \ #端口
-DENABLED_LOCAL_INFILE=1 \ #允许从本地导入数据
-DWITH_PARTITION_STORAGE_ENGINE=1 \ #安装支持数据库分区
-DEXTRA_CHARSETS=all \ #安装所有的字符集
-DDEFAULT_CHARSET=utf8 \ #默认字符
-DDEFAULT_COLLATION=utf8_general_ci



执行完毕之后我们然后make & make install


这样我们的mysql就安装好了。


然后我们需要做的事情就是为这个实例写一个配置文件


3. 为我们的这个实例搞一个配置文件


配置文件这个东西其实mysql都准备好了的,我们只需要拿出来改一改,进入到我们的安装目录/data/mysql1,将support-file文件夹下的my-medium.cnf作为我们的配置文件吧,


我将my-medium.cnf拷贝到了/data/mysql1目录下,并重命名为my.cnf,命令如下



cp my-medium.cnf ../my.cnf

打开我们的my.cnf,我们主要是需要改如下几个地方



[client]
#password = your_password
port = 3308
socket = /data/mysql1/mysql1.sock


# Here follows entries for some specific programs

# The MySQL server
[mysqld]
port = 3308
socket = /data/mysql1/mysql1.sock

skip-external-locking
key_buffer_size = 16M
max_allowed_packet = 1M
table_open_cache = 64
sort_buffer_size = 512K
net_buffer_length = 8K
read_buffer_size = 256K
read_rnd_buffer_size = 512K
myisam_sort_buffer_size = 8M

# Don’t listen on a TCP/IP port at all. This can be a security enhancement,
# if all processes that need to connect to mysqld run on the same host.
# All interaction with mysqld must be made via Unix sockets or named pipes.
# Note that using this option without enabling named pipes on Windows
# (via the "enable-named-pipe" option) will render mysqld useless!
#
#skip-networking

# Replication Master Server (default)
# binary logging is required for replication
log-bin=mysql1-bin

# binary logging format - mixed recommended
binlog_format=mixed

# required unique id between 1 and 2^32 - 1
# defaults to 1 if master-host is not set
# but will not function as a master if omitted
server-id = 2


port不用说了,这个肯定是为每一个mysql确定一个端口,socket这个是指每个mysql实例需要用的sock文件,server-id这个是全局统一的id号,不可以出现重复的,这三个地方是需要注意的。





4. 配置文件更改完毕之后,我们对mysql这个实例进行初始化


进入到scripts文件夹下,运行下面的命令



./mysql_install_db —defaults-file=/data/mysql1/my.cnf —basedir=/data/mysql1 —datadir=/data/mysql1/data —user=mysql



—defaults-file是指我们刚刚修改的配置文件,注意这里必须要用绝对路径,用相对路径就是个坑,坑爆了。


—basedir是指我们的这个实例所在的安装目录。


—datadir是指我们这个实例以后放数据的文件夹


5.这个脚本执行成功之后,我们进入到其bin的文件夹下准备启动它


执行以下命令



./mysqld_safe —defaults-file=/data/mysql1/my.cnf

一般的情况下,我们不出意外就可以启动它了


6.设置root的密码和远程访问的权限



./mysqladmin -P 3308 -S /data/mysql1/mysql1.sock -u root password

由于我们是多个实例,所以我们需要随时指定-P端口 -S sock文件


为了方便,我自己写了两个小脚本进行处理,入参如下


第一个脚本runSQL.sh,主要是进行关闭和启动mysql的


第一个参数是实例编号,像上面我们在/data/mysql1所以编号是1;


第二个参数是命令,shutdown和start,分别控制启动和关闭


第三个参数是端口号


以上三个参数都需要加上



dir=’/data/mysql’;
para=$1;
port=$3;
#echo $para;
sqlBasedir=$dir$para;
sqlDatadir=$sqlBasedir’/data’;
sqlRundir=$sqlBasedir’/bin’;
sqlConfigdir=$sqlBasedir’/my.cnf’;
sqlRunSock=$sqlBasedir’/mysql’$para’.sock’;
echo $2;
echo $sqlRundir;
cmd="start";
if [ "$cmd"x = "$2"x ];then
echo ‘start’;
$sqlRundir/mysqld_safe —defaults-file=$sqlConfigdir —user=mysql&
echo ‘ok’;
#echo $sqlBasedir;
#echo $sqlDatadir;
else
echo ‘shutdown’;
$sqlRundir/mysqladmin -P $port -S $sqlRunSock -uroot -p shutdown;
fi




第二个脚本是enterSQL.sh,主要是通过root账号进入到mysql控制台


第一个参数是实例编号,意义同上一个脚本


第二个参数是端口号



dir=’/data/mysql’;
para=$1;
port=$2;
#echo $para;
sqlBasedir=$dir$para;
sqlDatadir=$sqlBasedir’/data’;
sqlRundir=$sqlBasedir’/bin’;
sqlConfigdir=$sqlBasedir’/my.cnf’;
sqlRunSock=$sqlBasedir’/mysql’$para’.sock’;
$sqlRundir/mysql -P $port -S $sqlRunSock -uroot -p ;


这下我们安装好了一个区别于一般情况的mysql实例了。


下面只需要重复上面的步骤,分别把上面my.cnf中的红色的地方换掉就可以了。

3.新建的用户不能本地登录

一开始我为主从复制创建了一个新的用户,结果我发现,新创建的用户是不能本地登录的!以至于我的slave总是连接不上master而不能进行复制操作。


参考下文

4.来做我们的主从复制吧~

· 在master上创建一个复制账号并且授权



create user repl_user;
grant replication slave on . to repl_user@’%’ identified by ‘123456’;




然后在slave上进行如下配置



change master to master_host=’localhost’ master_port=3309 master_user=’repl_user’ master_password=’123456’

因为是在一台机器上所以host就是localhost,我选取的是一个端口为3309的mysql实例。


执行完这句之后,然后执行


start slave



这样大功告成。



有问题欢迎交流~