注意事项:
我们使用到的密码有:
虚拟机root密码:devops
mariadb的root账户的密码:passw0rd
rabbitmq的openstack用户的密码:passw0rd
1.在安装系统之后。
1)关闭防火墙:
systemctl disable firewalld
systemctl stop firewalld
2)关闭selinux
vi /etc/sysconfig/selinux
将SELINUX=disabled
3)配置网络IP
ip a #可以查看当前多少网卡,以及他们的IP地址
cd /etc/sysconfig/network-scripts/
配置第一个网卡(Host Only):
第二块(Host Only):
第三块(是NAT):
4)重启网络
systemctl restart network
5)修改hostname
vi /etc/hostname #
删掉默认的,然后写入:controller1
6)我们一般使用putty或者Xshell去连接虚拟机
7)安装一些工具(注意,这一步可以放在yum源配置之后做):
yum install vim net-tools wget -y
安装之后,千万不要:yum update
不要更新,他会升级到 CentOS 7.3
8)我们可以查看下自己的系统
cat /etc/redhat-release
9)配置yum 源为本地yum源:
cd /etc/yum.repos.d/
...
====================
1)主机hosts文件配置
修改/etc/hosts
文件在三个controlelr中。
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost4 localhost4.localdomain4
10.1.1.120 controller1 controller1.devops.com
10.1.1.121 controller2 controller2.devops.com
10.1.1.122 controller3 controller3.devops.com
10.1.1.123 compute1 compute1.devops.com
10.1.1.124 compute2 compute1.devops.com
10.1.1.125 nfs-backend backend.devops.com
10.1.1.126 cinder1 cinder1.devops.com
45.117.42.129 devops.taobao.com
我们只需要修改一个controlelr节点上的hosts文件,我们可以使用scp
命令传输到其他的controller中去:
scp /etc/hosts root@controller2:/etc/hosts # 注意controller2是已经在自己的hosts文件中描述清楚了的,ip地址
scp /etc/hosts root@controller3:/etc/hosts
2)使用scp
把yum源配置文件也拷贝到每个controller中。
3)安装每个yum工具按照7)的方式。
=======
给每个节点做ntp服务。
1)先安装ntp
:
yum install -y ntp
2)修改ntp
的配置:
vim /etc/ntp.conf
注释下面三个地址(server),修改第一个,如果本地搭建了ntp服务的话:
上图是本地搭建的ntp服务器,如果没有可以网上找找其他方法,注意不能写成:
server cn.pool.ntp.org iburst
#这样会报错。
然后重启ntp:
systemctl restart ntpd
systemctl status ntpd
3)同步时间:
# ntpdate cn.pool.ntp.org
然后查看运行date命令查看时间是否同步成功 注意,这个操作很重要,openstack是分布式架构的,每个节点都不能有时间差! 很多同学刚装完centos系统,时间会跟当前北京的时间不一致,所以必须运行下这个命令! 另外,也把这个命令加到开机启动里面去
# echo "ntpdate cn.pool.ntp.org" >> /etc/rc.d/rc.local
# chmod +x /etc/rc.d/rc.local
如果这里有问题,看看这篇文章的1,2 能否帮到:http://www.jianshu.com/writer#/notebooks/12348975/notes/14123412
就看上面我的简书文章的3。
如果错误不能解决的话(有可能是不能连接外网),就在本地服务器搭建一个NTP服务,Windows都可以搭建,我的ntp的简书文章有提到。
我们可以使用:
lsof -i :123 # 查看ntp服务的状态(端口123)
根据端口杀掉进程:
kill -9 5954 # 端口5954的端口被kill
======
互信
可以做也可以不做,做了只是要方便点在虚拟机之间切换。
我这里列出一个例子:
在controller1和cinder1之间做互信:
在cinder1节点:
ssh-keygen -t rsa
全部按enter键,
生成一个.pub
文件:
然后将这个.pub
文件使用ssh-copy-id
拷贝到controller1节点上。
ssh-copy-id -i /root/.ssh/id_rsa.pub -p 22 root@45.117.42.120
拷贝过去之后就,cinder1使用ssh
命令切换到controller1就不用输入密码了。
要想controller1切换cinder1,那么就在controller1也这样做一次。
##这里做快照:ntp-ok##
注意:快照回到这里的时候,需要做下ntp同步下。(ntpdate 10.1.1.1
)
====
安装MariaDB Galera
0)特别提醒:
没有同步时间的话,一定要同步时间:
注意:快照回到这里的时候,需要做下ntp同步下。(ntpdate 10.1.1.1
)
特别提醒:
内存一定要8G以及以上,快照恢复过来的时候,有可能是4G的。
1)在三个控制节点上面分别执行yum安装如下:
yum install -y MariaDB-server MariaDB-client galera xinetd rsync ntp ntpdate bash-completion percona-xtrabackup socat gcc gcc-c++ #注意: 如果之前有装ntp ntpdate 就不用再装了
systemctl start mariadb.service
mysql_secure_installation (执行设置mysql密码,注意,此份文档mysql密码为passw0rd)
注意:在上面的yum 安装命令中,除了
MariaDB-server MariaDB-client galera
这3个是与MariaDB Galera有关的,其余都是其他用处的。
我们在执行mysql_secure_installation
这条命令的时候,会有:
Enter current password for root (enter for none):
因为才装了mariadb,所以没有密码,就按Enter键。
接下来的提示:
Set root password? [Y/n]
我们可以来设置自己的密码:我这里设置的是:passw0rd
接下来的提示,全部输入:y
就OK。
2)在三个控制节点上都创建sst
用户,目的是给xtrabackup-v2
数据同步使用:
mysql -uroot -p # 这里的密码是上面设置的密码`passw0rd`。然后执行以下的命令
grant all privileges on *.* to 'sst'@'localhost' identified by 'devops';
flush privileges;
exit;
第一句是创建用户,赋予localhost权限。数据库的用户名是sst
,密码是devops
。
上面的三个控制节点的MariaDB安装,但是三个节点还没有关联起来。
3)关联这三个节点。
我们需要配置:/etc/my.cnf.d/
下面的client.cnf
,mysql-clients.cnf
和server.cnf
,这个server.cnf
特别重要。
这里就不使用手写了,太多的内容,就把百度云上面的配置文件拿过来覆盖下掉:
使用FileZilla去上传替换。
我们拷贝之后的server.cnf
如果使用FileZilla只拷贝到一个节点上面,那么其余的2个节点也可以使用scp
拷贝过去:
cd /etc/my.cnf.d/
scp client.cnf mysql-clients.cnf server.cnf controller2:/etc/my.cnf.d/
scp client.cnf mysql-clients.cnf server.cnf controller3:/etc/my.cnf.d/
拷贝过去之后注意要改变每个server.cnf
,其他的(比如:client.cnf
)注意需要修改节点和IP,这个必须改变。
修改这下面几个地方:
wsrep_node_name=xxx
wsrep_node_address=xxx
...
bind-address=xxx
....
max_connections=10000
4)修改三个控制节点的mysql最大连接数:
vim /usr/lib/systemd/system/mariadb.service
在[Service]
添加两行如下参数,(可以在最后一行添加):
LimitNOFILE=10000
LimitNPROC=10000
上面的步骤可以三个控制节点都修改,也可以修改一个,拷贝到其余2个。
修改完毕之后,三个都要执行:
systemctl daemon-reload
5)上面的三个控制节点my.cnf
都配置完成后,三个控制节点都要执行:
systemctl status mariadb # 查看状态
systemctl stop mariadb.service
然后在第一个节点用下面的命令初始化启动mariadb集群服务:
/usr/sbin/mysqld --wsrep-new-cluster --user=root & # 启动mariadb方式,很重要的一步骤
其他两个节点分别启动mariadb
:
systemctl start mariadb.service # 注意:这里建议一个一个的启动,不要controller2和3一起启动,不然有可能有timeout错误(也可能是因为ntpdate没有同步时间)。这里的节点启动的时候比较慢的,在第一个节点是有交互的,可以看打印在屏幕上的Log。这个是初始化的启动。
systemctl status mariadb.service
注意:我们在controller1中如果看见了:
2017-07-03 16:53:50 140012712617728 [Note] WSREP: Member 2.0 (controller2) synced with group.
就说明controller2加入组成功。
注意:在这里有可能会失败,我们可以执行多次:
systemctl stop mariadb.service
systemctl start mariadb.service
或者有可能是配置不够,我就加到了8G内存。
最后,其他两个节点启动成功了,再回到第一个节点:
在第一个控制节点按Enter键,回到控制输入台。
6)第一个控制节点执行:
pkill -9 mysql
pkill -9 mysql # 注意,这里是两次
systemctl start mariadb.service
systemctl status mariadb.service
注意:如果遇到启动不了服务的情况,看下具体的错误:如果是[ERROR] Can‘t init tc log
错误可以通过以下的方式解决:
cd /var/lib/mysql
chown mysql:mysql *
然后再重启服务即可,这是因为/var/lib/mysql/tc.log
用户组和用户名不是mysql
,更改下权限就行了。
7)验证,查看mariadb数据库集群状态
随便找一个控制节点:
mysql -uroot -p
mysql> show status like 'wsrep_cluster_size%';
mysql> show variables like 'wsrep_sst_meth%'; # 我们也可以查看集群方法是什么,这些都是随意查看的。
mysql> show variables like 'max_connections'; # 查看最大连接数,我们在3)和XX的时候修改的
我们看到集群的大小有3个。
查看数据库的库的个数:
默认有三个数据库。
我们随意在哪个控制节点创建一个测试数据库,那么在其余的控制节点也可以直接看到。
====
RabbitMQ Cluster集群
从下面几个方面来讲解:
RabbitMQ介绍
安装RabbitMQ集群
配置RabbitMQ插件
优化rabbit集群
1)RabbitMQ介绍:
如果安装的话,可以不看1)和2)。
简介
RabbitMQ是一套开源(MPL)的消息队列服务软件,是由LShift提供的一个Advanced Message Queuing Protocol(AMQP)的开源实现,由以高性能,健壮以及可伸缩性出名的Erlang语言写成。
特点:可伸缩性;消息持久化,从内存持久化消息到硬盘,再从硬盘加载到内存。
基本概念和架构
核心原理:发送消息,接受消息。
作用:主要用于组件之间的解耦,消息发送者无需知道消息使用者的存在。
Producer #生产者
Consumer #消费者
Broker #衬托消息队列的服务器实例(rabbitmq)
Exchange #交换机,决定消息往哪里发送
Bindings #绑定,也就是定义好的路由规则
Queue #队列,消息的容器,一个消息可投入一个或者多个队列。消息一直在队列里面,等待消费者连接到这个队列将其取走
Connection、Channel #通道,生产者和消费者需要和RabbitMQ建立TCP连接。一些应用需要多个connection,为了节省TCP连接,可以使用Channel,它可以被认为是一种轻型的共享的TCP连接的连接。
message #RabbitMQ转发的二进制对象。组成有:Headers(头)、Properties(属性)、和Data(数据),其中数据部分不是必要的。
exchange:
交换机,空字符串名字的exchange为默认的exchange。
Type类型:Direct,Fanout,Topic,Headers。类型决定exchange的消息转发能力。
durable:值为True/False。值为true的exchange在rabbitmq重启后会被自动创建。OpenStack使用的exchange的该值都为false。
auto_delete:值为True/False。设置为true的话,当所有消费者的连接都关闭后,该exchange会被自动删除。OpenStacke使用的exchange的该值都为Flase。
exclusive: 值为True/False。设置为true的话,该exchange只允许被创建的connection使用,并且在该connection关闭后它会被自动删除。
Direct:
转发消息到routingKey指定队列(完全匹配,单播)
Topic:
按规则转发消息(最灵活,组播)
符号#
和符号*
匹配0个或者多个单词,*
匹配不多不少一个单词。
Fanout:
转发消息到所有绑定组件,广播模式。
2)RabbitMQ集群优化
- 尽可能的吧RabbitMQ部署在单独的服务器中
- 开启HiPE模式,能够提高性能20-50%
- 增加socket和最大文件打开数
- 不要私用队列镜像
- 控制发送的指标数量或者频率
3)部署RabbitMQ
三个控制节点上面都装:
先把erlang语言装了。
yum install -y erlang
再装rabbitmq:
yum install -y rabbitmq-server
每个控制节点都启动rabbitmq及设置开机启动:
systemctl enable rabbitmq-server.service # 设置开机启动
systemctl restart rabbitmq-server.service # 启动rabbitmq
systemctl status rabbitmq-server.service # 查看状态
systemctl list-unit-files | grep rabbitmq-server.service # 查看rabbitmq是否在已启动的服务列表中
我们给三个控制节点创建openstack用户给rabbitmq:
rabbitmqctl add_user openstack passw0rd # 创建openstack用户,密码为passw0rd
rabbitmqctl set_permissions openstack ".*" ".*" ".*" # 对openstack用户赋予权限
rabbitmqctl set_user_tags openstack administrator
rabbitmqctl list_users # 列出用户
打开rabbitmq的一些插件:
/usr/lib/rabbitmq/bin/rabbitmq-plugins list # 查看rabbitmq插件,展示的[ ]如果里面没有E,说明没有开,如果有,就是开了的
/usr/lib/rabbitmq/bin/rabbitmq-plugins enable rabbitmq_management mochiweb webmachine rabbitmq_web_dispatch amqp_client rabbitmq_management_agent # 开启rabbitmq插件
/usr/lib/rabbitmq/bin/rabbitmq-plugins list # 再查看列表,看看开没有
systemctl restart rabbitmq-server # 重启rabbitmq
然后我们在浏览器中,查看是否web可以访问:
在浏览器中去输入controller1的地址+端口:
45.117.42.120:15672 # 这个IP地址是controller1的NAT网卡的地址
集群rabbitmq:
在controller1上面:
[root@controller1 my.cnf.d]# cat /var/lib/rabbitmq/.erlang.cookie
ZABMJQWDVVYNSFPPEKUA # 我们看到这一串字符串
使用scp拷贝到controller2和controller3:
scp /var/lib/rabbitmq/.erlang.cookie controller2:/var/lib/rabbitmq/.erlang.cookie # 拷贝到controller2
scp /var/lib/rabbitmq/.erlang.cookie controller3:/var/lib/rabbitmq/.erlang.cookie # 拷贝到controller3
拷贝完成之后,在controller2和controller3上重启rabbitmq和其他操作:
systemctl restart rabbitmq-server # 重启
rabbitmqctl stop_app
rabbitmqctl join_cluster --ram rabbit@controller1 # 如果rabbitmq的web网页是打开的,可以看到新加的节点
rabbitmqctl start_app
在任意控制节点,我们使用命令可以查看下集群:
rabbitmqctl cluster_status
优化rabbitmq:
我们从rabbitmq的web界面可以看出:
当前每个节点可以用的File 和 Socket数目都是1000左右,我们可以调节大一些。
我们打开三个控制节点的rabbitmq.config:
vim /etc/rabbitmq/rabbitmq.config #
每个controller都打开:{hipe_compile, true}
,前面的注释符号(%%
)去掉。
我们可以三个一个一个的编辑,也可以scp命令拷贝:
scp /etc/rabbitmq/rabbitmq.config controller2:/etc/rabbitmq/rabbitmq.config
scp /etc/rabbitmq/rabbitmq.config controller3:/etc/rabbitmq/rabbitmq.config
每个controller节点配置系统文件/etc/sysctl.conf
,可以每个编辑也可以使用scp
拷贝:
vim /etc/sysctl.conf
在sysctl.conf
文件中添加:
fs.file-max = 1000000
然后执行(注意,每个节点都要哈,不要少写了):
sysctl -p # 让其生效
每个控制节点都配置/etc/security/limits.conf
文件:
打开:
vim /etc/security/limits.conf
在打开的limits.conf
文件的末尾添加:
* soft nofile 655350
* hard nofile 655350
这个编辑后的文件拷贝到其他两个控制节点。
scp /etc/security/limits.conf controller2:/etc/security/limits.conf
scp /etc/security/limits.conf controller3:/etc/security/limits.conf
每个控制节点配置/etc/systemd/system.conf
文件:
vim /etc/systemd/system.conf
末尾添加:
DefaultLimitNOFILE=1024000
DefaultLimitNPROC=1024000
如果拷贝,使用scp
:
scp /etc/systemd/system.conf controller2:/etc/systemd/system.conf
scp /etc/systemd/system.conf controller3:/etc/systemd/system.conf
我们将三个控制节点都重启一下:
reboot # 重启
注意:如果重启有问题(我出了问题,是因为controller3的/etc/rc.d/rc.local
这个文件之前加了ntpdate cn.pool.ntp.org
,没有设置执行权限:chmod +x /etc/rc.d/rc.local
),
我们先看数据库:mariadb有没有问题:
systemctl status mariadb # 查看mariadb状态
如果是有问题,就是没有启动的意思,那么将三个控制节点的每一个mariadb都关闭:
systemctl stop mariadb.service
在controller1中重启:
/usr/sbin/mysqld --wsrep-new-cluster --user=root &
在另外两个重启:
比如rabbitmq没有运行着,那么就需要手动启动下rabbitmq:
查看状态:
rabbitmqctl cluster_status # 查看状态
systemctl status rabbitmq-server.service # 查看服务状态
列出rabbitmq的插件:
/usr/lib/rabbitmq/bin/rabbitmq-plugins list # 可能插件没有问题,但是服务有问题。开始我以为是rabbitmq的问题,
后来发现是mariadb集群的配置没有做好,也就是说重启后,mariadb没有开开:
我们可以在任意控制节点上:
ulimit -Hn # 查看我们修改的配置
我们进入rabbitmq的web界面看下我们的加大后的配置。