ubuntu17.04使用systemd设置开机启动

ubuntu从16.04开始不再使用initd管理系统,改用systemd。
然而systemd很难用,刚开始接触有点烦,改变太大,跟之前的完全不同。

吐槽完开始正题:

使用systemd设置开机启动

为了像以前一样,在/etc/rc.local中设置开机启动程序,需要以下几步:

1、systemd默认读取/etc/systemd/system下的配置文件,该目录下的文件会链接/lib/systemd/system/下的文件。一般系统安装完/lib/systemd/system/下会有rc-local.service文件,即我们需要的配置文件。

链接过来:

ln -fs /lib/systemd/system/rc-local.service /etc/systemd/system/rc-local.service
cd /etc/systemd/system/
vim rc-local.service

rc-local.service内容:

#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.

# This unit gets pulled automatically into multi-user.target by
# systemd-rc-local-generator if /etc/rc.local is executable.
[Unit]
Description=/etc/rc.local Compatibility
ConditionFileIsExecutable=/etc/rc.local
After=network.target

[Service]
Type=forking
ExecStart=/etc/rc.local start
TimeoutSec=0
RemainAfterExit=yes
GuessMainPID=no

[Install]
WantedBy=multi-user.target
Alias=rc-local.service

2、创建/etc/rc.local文件

touch /etc/rc.local

3、赋可执行权限

chmod 755 /etc/rc.local

4、编辑rc.local,添加需要开机启动的任务

#!/bin/bash

echo "test test " > /var/test_boot_up.log

5、执行reboot重启系统验证OK。

最后,说一下/etc/systemd/system/下的配置文件(XXXX.service),
其中有三个配置项,[Unit] / [Service] / [Install]

  • [Unit] 区块:启动顺序与依赖关系。
  • [Service] 区块:启动行为,如何启动,启动类型。
  • [Install] 区块,定义如何安装这个配置文件,即怎样做到开机启动。

ceph运维中常见的pg状态

pg ( placement group ) 是数据存储的重要单位。

在使用 ceph 的时候, pg 会经常发生状态的变化,例如:

  • 当创建池的时候, 将会创建相应的 pg, 那么可以看到 pg creating 状态
  • 当部分 pg 创建成功后, 将会发现 pg 会进入 peering 状态
  • 当所有 pg peering 完成后, 将可见到状态变成 active+clean

常见的 pg 状态

creating (创建中)

PG 正在被创建, 通常当存储池正在卑创建或增加一个存储池的 PG 数量时, PG 会呈现这个状态

Down (失效)

PG 处于失效状态, PG 应该处于离线状态

repair(修复)

PG 正在被检查, 被发现的任何不一致都将尽可能被修复.

peering (等待互联)

  1. 当 ceph peering pg, ceph 将会把 pg 副本协定导入 osd, 当 ceph 完成 peering, 意味着 osd 同意当前 PG 状态, 并允许写入
  2. PG 处于 peering 过程中, peering 由主 osd 发起的使存放 PG 副本的所有 OSD 就 PG 的所有对象和元素数据的状态达成一致的过程, peering 过程完成后, 主 OSD 就可以接受客户端写请求.

Active (活动)

  1. 当 ceph 完成 peering 过程, pg 将会变成 active, active 状态意味着 pg 中的数据变得可用, 主 pg 将可执行读写操作
  2. PG 是活动的, 意味着 PG 中的数据可以被读写, 对该 PG 的操作请求都讲会被处理.

Clean (干净)

  1. 当 pg 显示 clean 状态, 主 osd 与副本 osd 成功同步并且没有异步复制, ceph 在 pg 中所有对象具有正确的副本数量
  2. PG 中的所有对象都已经卑复制了规定的副本数量.

Replay (重做)

某 OSD 崩溃后, PG 正在等待客户端重新发起操作

Degraded (降级)

  1. 当客户端写对象到主 osd, 主 OSD 会把数据写复制到对应复制 OSD, 在主 OSD 把对象写入存储后, PG 会显示为 degraded 状态, 直到主 osd 从复制 OSD 中接收到创建副本对象完成信息

  2. PG 处于 active+degraded 原因是因为 OSD 是处于活跃, 但并没有完成所有的对象副本写入, 假如 OSD DOWN, CEPH 标记每个 PG 分配到这个相关 OSD 的
    状态为 degraded, 当 OSD 重新上线, OSD 将会重新恢复,

  3. 假如 OSD DOWN 并且 degraded 状态持续, CEPH 会标记 DOWN OSD, 并会对集群迁移相关 OSD 的数据, 对应时间由 mon osd down out interval 参数决定

  4. PG 可以被北极为 degraded, 因为 ceph 在对应 PG 中无法找到一个或者多个相关的对象, 你不可以读写 unfound 对象, 你仍然可以访问标记为 degraded PG 的其他数据

  5. PG 中部分对象的副本数量未达到规定的数量

Inconsistent (不一致)

PG副本出现不一致, 对象大小不正确或者恢复借宿后某个副本出现对象丢失现象

recoverying (恢复中)

ceph 设备故障容忍在一定范围的软件与硬件问题, 当 OSD 变 DOWN, 那么包含该 OSD 的 PG 副本都会有问题, 当 OSD 恢复, OSD 对应的 PG 将会更新
并反映出当前状态, 在一段时间周期后, OSD 将会恢复 recoverying 状态

recovery 并非永远都有效, 因为硬件故障可能会导致多个 OSD 故障, 例如, 网络交换机故障, 可以导致集群中的多个主机及主机包含的 OSD 故障
当网络恢复之后, 每个 OSD 都必须执行恢复

CEPH 提供一定数量的设定在新服务请求与恢复 PG 中数据对象时的资源平衡,
osd recovery delay start 设定允许 osd 重启, re-peer 并在启动 恢复之前处理一些回应请求,
osd recovery threads 设定了恢复过程中线程限制 (默认 1 )
osd recovery thread timeout 设定线程超时, 因为可能出现多个 osd 故障, 重启后在 re-peer 过程中可能出现污染
osd recovery max active 设定限制对一个 osd 从故障后, 恢复请求并发数量
osd recovery max chunk 限制恢复时的数据 chunk 大小, 预防网络堵塞

PG 正在迁移或者同步对象及其副本, 一个 OSD 停止服务(DOWN), 其内容将会落后与 PG 内的其他副本, 这时 PG 将会进入 recoverying 状态, 该 OSD 上的对象将从其他副本同步过来

BACK FILLING (回填)

当新 OSD 加入集群, CRUSH 将会为集群新添加的 OSD 重新分配 PG, 强制新的 OSD 接受重新分配的 PG 并把一定数量的负载转移到新 OSD 中
back filling OSD 会在后台处理, 当 backfilling 完成, 新的 OSD 完成后, 将开始对请求进行服务

在 backfill 操作期间, 你可以看到多种状态,
backfill_wait 表示 backfill 操作挂起, 但 backfill 操作还没有开始 ( PG 正在等待开始回填操作 )
backfill 表示 backfill 操作正在执行
backfill_too_full 表示在请求 backfill 操作, 由于存储能力问题, 但不可以完成,

ceph 提供设定管理装载重新分配 PG 关联到新的 OSD
osd_max_backfills 设定最大数量并发 backfills 到一个 OSD, 默认 10
osd backfill full ratio 当 osd 达到负载, 允许 OSD 拒绝 backfill 请求, 默认 85%,
假如 OSD 拒绝 backfill 请求, osd backfill retry interval 将会生效, 默认 10 秒后重试
osd backfill scan min , osd backfill scan max 管理检测时间间隔

一个新 OSD 加入集群后, CRUSH 会把集群先有的一部分 PG 分配给他, 该过程称为回填, 回填进程完成后, 新 OSD 准备好了就可以对外提供服务

REMAPPED (重映射)

当 pg 改变, 数据从旧的 osd 迁移到新的 osd, 新的主 osd 应该请求将会花费一段时间, 在这段时间内, 将会继续向旧主 osd 请求服务, 直到
PG 迁移完成, 当数据迁移完成, mapping 将会使用新的 OSD 响应主 OSD 服务

当 PG 的 action set 变化后, 数据将会从旧 acting set 迁移到新 action set, 新主 OSD 需要过一段时间后才能提供服务, 因此它会让老的主 OSD 继续提供服务, 知道 PG 迁移完成, 数据迁移完成后, PG map 将会使用新 acting set 中的主 OSD

参考例子

[root@hh-yun-ceph-cinder015-128055 ~]# ceph osd map volumes rbd_id.volume-1421625f-a9a2-41d0-8023-4cec54b33a57
osdmap e5276 pool 'volumes' (1) object 'rbd_id.volume-1421625f-a9a2-41d0-8023-4cec54b33a57' -> pg 1.2cdd8028 (1.28) -> up ([32,26,41], p32) acting ([32,26,41], p32)

STALE (旧)

当 ceph 使用 heartbeat 确认主机与进程是否运行, ceph osd daemon 可能由于网络临时故障, 获得一个卡住状态 (stuck state) 没有得到心跳回应
默认, osd daemon 会每 0.5 秒报告 PG, up 状态, 启动与故障分析,
假如 PG 中主 OSD 因为故障没有回应 monitor 或者其他 OSD 报告 主 osd down, 那么 monitor 将会标记 PG stale,
当你重启集群, 通常会看到 stale 状态, 直到 peering 处理完成,
在集群运行一段时候, 看到 stale 状态, 表示主 osd PG DOWN 或者没有主 osd 没有报告 PG 信息到 monitor 中

PG 处于未知状态, monitors 在 PG map 改变后还没有收到过 PG 的更新, 启用一个集群后, 常常会看到主 peering 过程结束前 PG 处于该状态

Scrubbing (清理中)

PG 在做不一至性校验

有问题的 PG

inactive

PG 很长时间没有显示为 acitve 状态, (不可执行读写请求), PG 不可以执行读写, 因为等待 OSD 更新数据到最新的备份状态

unclean

PG 很长时间都不是 clean 状态 (不可以完成之前恢复的操作), PG 包含对象没有完成相应的复制副本数量, 通常都要执行恢复操作

stale

PG 状态很长时间没有被 ceph-osd 更新过, 标识存储在该 GP 中的节点显示为 DOWN, PG 处于 unknown 状态, 因为 OSD 没有报告 monitor 由

反向代理之haproxy安装及简单配置tcp代理

一、简介

HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且
可靠的一种解决方案。

HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。

HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单
安全的整合进您当前的架构中,同时可以保护你的web服务器不被暴露到网络上。

HAProxy实现了一种事件驱动, 单一进程模型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制 、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接
事件驱动模型因为在有更好的资源和时间管理的用户空间(User-Space) 实现所有这些任务,所以没有这些问题。此模型的弊端是,在多核系统上,这些程序通常扩展性较差。

这就是为什么他们必须进行优化以 使每个CPU时间片(Cycle)做更多的工作。

二、安装

1. 环境准备

环境设置:

web-node1:
[root@web-node1 src]# uname -r
3.10.0-229.el7.x86_64
[root@web-node1 src]# uname -m
x86_64
[root@web-node1 src]# cat /etc/hostname 
web-node1
[root@web-node1 src]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
10.0.0.64    zabbix_master
10.0.0.65    web-node1
10.0.0.66    web-node2
web-node2:
[root@web-node2 src]# uname -r
3.10.0-229.el7.x86_64
[root@web-node2 src]# uname -m
x86_64
[root@web-node2 src]# cat /etc/hostname 
web-node2
[root@web-node2 src]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
10.0.0.64    zabbix_master
10.0.0.65    web-node1
10.0.0.66    web-node2

2. 安装haproxy

目前haproxy最高版本是1.7.8,本次实验使用1.7.5

下载地址:http://www.haproxy.org/download/1.7/

web-node1:

[root@web-node1 haproxy-1.7.5]#    cd /usr/local/src
[root@web-node1 ]# wget http://www.haproxy.org/download/1.7/src/haproxy-1.7.5.tar.gz
[root@web-node1 haproxy-1.7.5]#  tar -zxf  haproxy-1.7.5.tar.gz 
[root@web-node1 haproxy-1.7.5]#  cd haproxy-1.7.5
[root@web-node1 haproxy-1.7.5]#   make TARGET=linux2628 PREFIX=/usr/local/haproxy-1.7.5
[root@web-node1 haproxy-1.7.5]# make install PREFIX=/usr/local/haproxy-1.7.5
[root@web-node1 haproxy-1.7.5]# cp /usr/local/sbin/haproxy /usr/sbin/
[root@web-node1 local]# ln -s /usr/local/haproxy-1.7.5 /usr/local/haproxy
[root@web-node1 haproxy-1.7.5]# haproxy -v
HA-Proxy version 1.7.5 2017/04/03
Copyright 2000-2017 Willy Tarreau <[email protected]>
#参数说明
TARGET=linux26 #内核版本,使用uname -r查看内核,如:2.6.18-371.el5,此时该参数就为linux26;kernel 大于2.6.28的用:TARGET=linux2628
PREFIX=/usr/local/haprpxy #/usr/local/haprpxy为haprpxy安装路径

3. 编辑Haproxy启动脚本

[root@web-node1 haproxy-1.7.5]# cp /usr/local/src/haproxy-1.7.5/examples/haproxy.init /etc/init.d/haproxy
[root@web-node1 haproxy-1.7.5]# chmod +x /etc/init.d/haproxy

4. 创建haproxy相关目录

[root@web-node1 haproxy-1.7.5]# useradd -r haproxy  ##创建系统用户
[root@web-node1 haproxy-1.7.5]# mkdir /etc/haproxy
[root@web-node1 haproxy-1.7.5]# mkdir /var/lib/haproxy
[root@web-node1 haproxy-1.7.5]# mkdir /var/run/haproxy

5. 修改配置文件

[root@web-node1 haproxy-1.7.5]# cat /etc/haproxy/haproxy.cfg 
global
   log 127.0.0.1 local3 warning
   chroot /var/lib/haproxy
   user haproxy
   group haproxy
   nbproc  1
   maxconn 65535 
   daemon
defaults
   log global
   option dontlognull
   timeout connect 5000
   timeout client 50000
   timeout server 50000
listen test
 bind 10.0.0.65:8080
 mode tcp
 #balance roundrobin
 timeout server 15s
 timeout connect 15s
 server web01 10.0.0.66:22 check port 22 inter 5000 fall 5 

6. 启动haproxy

检查语法:
/usr/sbin/haproxy  -f /etc/haproxy/haproxy.cfg -c
[root@web-node1 haproxy-1.7.5]# /etc/init.d/haproxy start
查看进程:
[root@web-node1 haproxy-1.7.5]# ps -ef|grep haproxy
haproxy   11126      1  0 16:20 ?        00:00:00 /usr/sbin/haproxy -D -f /etc/haproxy/haproxy.cfg -p /var/run/haproxy.pid
root      11183   2633  0 16:32 pts/1    00:00:00 grep --color=auto haproxy

三、测试tcp代理是否成功

未分类

上述可以看出已经成功了。

搭建自己的ngrok服务器-debian版

作为一个Web开发者,我们有时候会需要临时地将一个本地的Web网站部署到外网,以供他人体验评价或协助调试等等,通常我们会这么做:

  1. 找到一台运行于外网的Web服务器。
  2. 服务器上有网站所需要的环境,否则自行搭建
  3. 将网站部署到服务器上
  4. 调试结束后,再将网站从服务器上删除

只不过是想向朋友展示一下网站而已,要不要这么麻烦,累感不爱。

安装go lang环境

wget http://www.golangtc.com/static/go/1.7.3/go1.7.3.linux-amd64.tar.gz

常见的不同版本根据下方来匹配(可以到这里下载):

mac: darwin-amd64
ubuntu: linux-amd64
centos: linux-386

或者使用命令安装:

apt-get install golang-go

安装git

apt-get install git

git clone ngrok源码,编译

ngrok源码:https://github.com/inconshreveable/ngrok.git

进入/usr/local目录

git clone https://github.com/inconshreveable/ngrok.git

引入临时的全局环境变量,此次登录有效

# 这个等会编译的时候要用
export GOPATH=/usr/local/ngrok/
# 这个是你自己的域名,可以是二级或三级域名
# 注意,这边ngrok.gabin.top和它的所有子域名都必须指向中转服务器,我最开始就是没有注意这点,导致各种没报错,但是就是不能用
export NGROK_DOMAIN="atecher.net"

替换域名证书,注意到了吗,NGROK_DOMAIN这个环境变量是我们刚刚设置的。

#生成证书
cd /usr/local/ngrok
openssl genrsa -out rootCA.key 2048
openssl req -x509 -new -nodes -key rootCA.key -subj "/CN=$NGROK_DOMAIN" -days 5000 -out rootCA.pem
openssl genrsa -out server.key 2048
openssl req -new -key server.key -subj "/CN=$NGROK_DOMAIN" -out server.csr
openssl x509 -req -in server.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out server.crt -days 5000
#替换证书
cp rootCA.pem assets/client/tls/ngrokroot.crt
cp server.crt assets/server/tls/snakeoil.crt
cp server.key assets/server/tls/snakeoil.key

开始生成服务端执行文件

# 自己注意下,不同操作系统“GOARCH”是不一样的参数,上面也有写到了
GOOS=linux GOARCH=amd64 make release-server

成功之后在/usr/local/ngrok/bin目录下会生成一个ngrokd的文件,这就是服务端的启动执行文件了

生成客户端可执行文件

#--mac
cd /usr/local/ngrok
GOOS=darwin GOARCH=amd64 make release-client
#--window
cd /usr/local/ngrok
GOOS=windows GOARCH=amd64 make release-client
#成功之后在/usr/local/ngrok/bin目录下会生成对应的目录,一般是darwin_amd64和window_64,前一个是mac的,后一个是window的

替换掉引用(国内被墙了,没法用)

vim /usr/local/ngrok/src/ngrok/log/logger.go
# 替换掉import中log的引用,记得删除旧的,别注释了,会报错哈哈
log "github.com/keepeye/log4go"

调试

  • 启动服务端,这边使用的是80端口。一般都需要用这个,原本想用反向代理,发现好像是不行。如果有发现可以的朋友,可以分享一下。

如果需要在后台执行的话,参考nohup命令

# 由于NGROK_DOMAIN是临时的环境变量,所以如果要重复使用的话,这个变量最好保存起来,否则下次登录就失效了。
/usr/local/ngrok/bin/ngrokd -domain="$NGROK_DOMAIN" -httpAddr=":80"
  • 启动客户端

先设置好配置文件:同目录下创建一个ngrok.cfg

server_addr: "blog.atecher.net:4443"
trust_host_root_certs: false
# 通过配置文件启动,这边的端口代表的是自己本地调试程序启用的端口,一般是8080
./ngrok -config=./ngrok.cfg -subdomain=blog 80

好了,可以用了。访问以下 blog.atecher.net

PS:

  1. 其实主要就是装好go环境,如果想学习新的程序语言,可以考虑下这个最近正火的语言
  2. 需要知晓基础的一些知识:环境变量、证书、make(虽然我也不是很懂,总之做多了会有点感觉,就感觉这么做是对的…)
  3. 如果没有测试环境可以用的话,可以购买特价的国际域名,一般一年不要十几二十块的,然后申请个像是华为企业云的服务器(本人就申请了一个1块钱15天的试用服务),就可以自己动手尝试了
  4. 其实自己没有服务器资源的可以使用国人分享出来的,百度搜索一下,最近看着还蛮多的

修复阿里云 Debian 源

经常重装的我,每次重装完忘记修改阿里云的默认源,update 之后每次都会报错。

下面是修复步骤。

1. 先删除默认的源

rm /etc/apt/sources.list.d/sources-aliyun*

2. 在修改源

vim /etc/apt/sources.list.d/sources-aliyun-0.list

Debian 7 修改成这样:

deb http://mirrors.aliyun.com/debian wheezy main contrib non-free
deb-src http://mirrors.aliyun.com/debian wheezy main contrib non-free
deb http://mirrors.aliyun.com/debian wheezy-updates main contrib non-free
deb-src http://mirrors.aliyun.com/debian wheezy-updates main contrib non-free
deb http://mirrors.aliyun.com/debian-security wheezy/updates main contrib non-free
deb-src http://mirrors.aliyun.com/debian-security wheezy/updates main contrib non-free

Debian 8 修改成这样:

deb http://mirrors.cloud.aliyuncs.com/debian/ jessie main contrib non-free
deb-src http://mirrors.cloud.aliyuncs.com/debian/ jessie main contrib non-free
deb http://mirrors.cloud.aliyuncs.com/debian/ jessie-proposed-updates main non-free contrib
deb-src http://mirrors.cloud.aliyuncs.com/debian/ jessie-proposed-updates main non-free contrib
deb http://mirrors.cloud.aliyuncs.com/debian/ jessie-updates main contrib non-free
deb-src http://mirrors.cloud.aliyuncs.com/debian/ jessie-updates main contrib non-free

最后:

apt-get update

Debian/Ubuntu 更新内核开启 TCP BBR 拥塞控制算法

BBR (Bottleneck Bandwidth and RTT) 是 Google 提供的 TCP 拥塞控制算法,适用于复杂网络环境下的 TCP 加速。

首先需要准备的条件

  • Debian 8.x 或者 Debian 9.x 系统,当然也适合 Ubuntu 14.04 或 Ubuntu 16.04
  • 如果是虚拟机,那么得使用 KVM 或 Xen 等可以修改内核的平台
  • 如果不是新的机器,请事先做好备份,因为内核万一挂了机器启动不起来是一件及其麻烦的事情

升级内核

BBR 只支持 4.9.x 以上的内核,所以我们需要更新升级以下

如果你使用的是 Debian 9.x,那么这一步可以直接跳过,其他三个内核版本较旧的系统,我们可以使用 Ubuntu 打包好的内核安装包

首先,找到 4.9.x 以上版本的稳定内核,这里我们推荐使用 LTS 版本,目前最新的是 4.9.40 下载安装即可

mkdir kernel-tmp && cd kernel-tmp
wget http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.9.40/linux-headers-4.9.40-040940_4.9.40-040940.201707271932_all.deb
wget http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.9.40/linux-headers-4.9.40-040940-generic_4.9.40-040940.201707271932_amd64.deb
wget http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.9.40/linux-image-4.9.40-040940-generic_4.9.40-040940.201707271932_amd64.deb
sudo dpkg -i *.deb

安装完以后直接 reboot 重启,一切顺利的话请检查以下当前的内核版本

root@debian ~ # uname -r
4.9.0-3-amd64

写入配置文件

直接修改 /etc/sysctl.conf 文件即可

cat >> /etc/sysctl.conf << EOF
net.core.default_qdisc=fq
net.ipv4.tcp_congestion_control=bbr
EOF

然后使用 sysctl -p 命令让内核配置生效,不出意外,应该会提示

root@debian ~ # sysctl -p
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr

此时可以使用 lsmod | grep bbr 命令检查 BBR 是否已正确开启

root@debian ~ # lsmod | grep bbr
tcp_bbr                16384  61

如果出现 tcp_bbr 字样则说明没有问题。

Debian快速安装MariaDB Server教程

简介

MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可MariaDB的目的是完全兼容MySQL,包括API和命令行,使之能轻松成为MySQL的代替品。

MariaDB、MySQL这样的数据库编译非常耗时而且编译很容易出错,所以使用编译好的版本无疑是最好的,设置页非常的方便。

安装

MariaDB的软件源由官方提供,程序的质量和安全绝对是毋庸置疑的。

本教程适用于:Debian 8(Jessie)支持安装10.0~最新,Debian 9(stretch)支持安装10.1~最新。

教程以10.2版本为例,其他版本只需将下面的10.2修改为10.1 10.0即可。

apt-get install software-properties-common
apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xF1656F24C74CD1D8add-apt-repository 'deb [arch=amd64] http://mirrors.tuna.tsinghua.edu.cn/mariadb/repo/10.2/debian stretch main'
apt update
apt install mariadb-server

安装过程中,这里会提示设置数据库Root密码,需要连续输入两次。

设置

输入下面的命令,关闭一些不安全的设置:

mysql_secure_installation 

首先输入密码,然后一路y即可。

Enter current password for root (enter for none):
解释:输入当前 root 用户密码,默认为空,直接回车。
Set root password? [Y/n]  y
解释:要设置 root 密码吗?输入 y 表示愿意。
Remove anonymous users? [Y/n]  y
解释:要移除掉匿名用户吗?输入 y 表示愿意。
Disallow root login remotely? [Y/n]  y
解释:不想让 root 远程登陆吗?输入 y 表示愿意。
Remove test database and access to it? [Y/n]  y
解释:要去掉 test 数据库吗?输入 y 表示愿意。
Reload privilege tables now? [Y/n]  y
解释:想要重新加载权限吗?输入 y 表示愿意。

管理

systemctl restart mysql #重启
systemctl start mysql #启动
systemctl stop mysql #关闭
systemctl status mysql #检查状态

更新

运行下面的命令系统就会更新所有可以更新的软件包括MariaDB

apt update
apt upgrade -y

Ubuntu 14.04下适应Docker搭建solrCloud集群

主要内容:

技术关键点:docker17.06.3安装,docker自制镜像及相关容器操作,docker分配固定IP及添加端口映射,solrCloud集群部署等

主要思路:在Ubuntu14.04操作系统的宿主机中,安装docker17.06.3,将宿主机的操作系统制作成docker基础镜像,之后使用自制的基础镜像在docker中启动3个容器,分配固定IP,再在3个容器中配置solrCloud集群。

注:solrCloud采用的solr内置jetty,需要单独配置zookeeper
容器IP及名称见下表:

编号    静态IP        容器名称

1      172.18.0.11   server1
2      172.18.0.12   server2
3      172.18.0.13   server3

一、在宿主机安装docker最新版

1、更新apt-get

apt-get update

2、安装curl工具

apt-get install curl

3、获取并安装docker最新版

curl -fsSL https://get.docker.com/ | sh

4、查看docker版本

docker -v

未分类

二、在宿主机制作Ubuntu14.10基础镜像ubuntu-self

1、将本机操作系统打包成tar文件

tar --numeric-owner --exclude=/proc --exclude=/sys -cvf ubuntu-self.tar /

未分类

2、将制作的tar文件导入docker镜像库中,并命令为:ubuntu-self:

cat ubuntu-self.tar | docker import - ubuntu-self

3、现在可以运行它了:

docker run -i -t ubuntu-self 

注:官方提供的镜像库中Ubuntu无法sudo,不太好用,这里我自己利用本机的操作系统生成了一个基础纯净版镜像,命名为ubuntu-self,大小约3.5G,里面没有安装任何软件。

三、配置宿主机的hosts文件,以便利用ssh登录容器

1、修改hosts文件,添加如下内容:

vi /etc/hosts
172.18.0.11 server1
172.18.0.12 server2
172.18.0.13 server3

2、查看hosts文件

cat /etc/hosts

未分类

四、启动一个容器,设置静态IP,命名为server1

1、在宿主机上创建自定义网络

docker network create --subnet=172.18.0.0/16 search_network

备注:这里选取了172.18.0.0网段,也可以指定其他任意空闲的网段,search_network为自定义网桥的名字,可自己任意取名。

2、利用docker启动容器server1,分配固定IP 172.18.0.11,并将容器的8983端口与宿主机8983进行映射,以便可以从外部访问容器

docker run -itd --name server1 --net search_network --ip 172.18.0.11 -p 8983:8983 ubuntu-self /bin/bash

注:该命令执行完之后直接进入到server1的命令行界面,主机名称变为docker分配的随机字符串,查看ip是否为静态,执行结果如下图所示:

未分类

五、继续操作,在容器server1中配置ssh服务

1、aptget升级

apt-get update

2、安装openssh服务

apt-get install openssh-server

3、开启ssh服务

sudo /etc/init.d/ssh start

4、设置ssh开机启动

vi /etc/rc.local

添加如下内容:

service ssh start

5、退出容器,在宿主机中采用ssh登录

exit

未分类

6、在宿主机切换到tank用户(root登录ssh需要修改ssh配置文件,这里用tank用户登录更方便些),并ssh到容器server1

su tank
ssh server1

未分类

六、在容器server1中安装jdk1.8并配置java环境变量

1、解压缩文件

tar -zxvf jdk1.8.0_141.tar.gz -C /usr/local/java/

2、向/etc/profile文件中追加下面内容:

export JAVA_HOME=/usr/local/java/jdk1.8.0_141
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=$PATH:${JAVA_HOME}/bin

3、让文件生效

source /etc/profile

4、验证java成功安装

java -version

未分类

七、在容器server1中安装配置zookeeper-3.4.10

1、解压zookeeper 安装包到/usr/local目录中

tar -zxvf zookeeper-3.4.10.tar.gz -C /usr/local/

2、创建zookeeper的data和logs目录,确保拥有读写权限

mkdir /home/tank/zookeeper/data
mkdir /home/tank/zookeeper/log

3、将zookeeper安装目录下conf文件夹中的zoo_sample.cfg重命名为zoo.cfg

未分类

4、修改zoo.cfg内容,zoo.cfg配置完后如下:

# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=/home/tank/zookeeper/data
dataLogDir=/home/tank/zookeeper/log
# the port at which the clients will connect
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1
server.1=172.18.0.11:2888:3888
server.2=172.18.0.12:2888:3888
server.3=172.18.0.13:2888:3888

5、进入/home/tank/zookeeper/data中,新建myid文件,写入1

未分类

注:其他两个节点的myid内容应分别是2和3

八、在容器server1中安装配置solr-6.6.0

1、解压solr-6.6.0.tgz到/usr/local目录下

tar -zxvf solr-6.6.0.tgz -C /usr/local/

未分类

2、创建solrCloud根目录solr_cloud_home文件夹

mkdir /usr/local/solrCloud/solr_cloud_home

3、复制/usr/local/solr-6.6.0/server/solr/目录下的文件到

solr_cloud_home中
cp /usr/local/solr-6.6.0/server/solr/* /usr/local/solrCloud/solr_cloud_home/

查看solr_cloud_home目录,如图所示:

ls

未分类

4、创建配置存放目录solr_cloud_collection文件夹

mkdir /usr/local/solrCloud/solr_cloud_collection

5、复制/usr/local/solr-6.6.0/example/example-DIH/solr/solr/目录下的文件到solr_cloud_collection/cloud_core中

mkdir /usr/local/solr_cloud_collection/cloud_core
cp /usr/local/solr-6.6.0/example/example-DIH/solr/solr/* /usr/local/solr_cloud_collection/cloud_core/
ls

未分类

九、在宿主机提交容器server1为新的镜像,命名为ubuntu-self-solr

sudo docker commit server1 ubuntu-self-solr
docker images

未分类

十、利用上一步生成的镜像启动容器server2,server3

1、在宿主机启动容器server2,设置IP为172.18.0.12

docker run -itd --name server2 --net search_network --ip 172.18.0.12 ubuntu-self-solr /bin/bash

2、将容器server2中/home/tank/zookeeper/data/myid内容由1改为2

3、退出容器server2,回到宿主机

exit

4、在宿主机启动容器server3,设置IP为172.18.0.13

docker run -itd --name server3 --net search_network --ip 172.18.0.13 ubuntu-self-solr /bin/bash

5、将容器server3中/home/tank/zookeeper/data/myid内容由1改为3

6、退出容器server3,回到宿主机

exit

7、在宿主机中查看docker容器运行情况

docker ps

未分类

十一、在宿主机ssh登录容器server1,server2,server3 并分别启动zookeeper

ssh server1
cd /usr/local/zookeeper-3.4.10/
bin/zkServer.sh start
/usr/local/zookeeper-3.4.10/bin/zkServer.sh start

未分类

注:在server2,server3上同样执行此操作

十二、在宿主机ssh登录容器server1,server2,server3并启动solr

1、ssh登录server1,cloud模式下启动solr

ssh server1
cd /usr/local/solr-6.6.0
bin/solr start -cloud -p 8983 -s "/usr/local/solrCloud/solr_cloud_home/" -z "172.18.0.11:2181,172.18.0.12:2181,172.18.0.13:2181"

未分类

2、打开宿主机浏览器,访问页面http://172.18.0.11:8983/solr/,可以进入solr页面即代表启动成功

注:在server2,server3上同样执行此操作

十三、在容器server1上创建Collection(只需要在一台solr节点上操作)

1、由solr命令建立索引,这里索引命名为:cloudsuite_web_search
进入solr/bin目录,使用solr命令:

cd /usr/local/solr-6.6.0
bin/solr create_collection -c cloudsuite_web_search -shards 3 -replicationFactor 3 -d /usr/local/solrCloud/solr_cloud_collection/cloud_core/conf -p 8983 

-c 核心名称tar
-shards 分片数量
– replicationFactor 副本数量 (一般指有几台solr集群)

2、将solr提供的xml示例文件上传至索引

bin/post -c cloudsuite_web_search *.xml

十四、在宿主机上通过浏览器访问solrCloud集群,验证操作成功

安装成功后,无论从哪个节点访问8983端口,均可以看到cloud的拓扑模式,如下所示

未分类

Ubuntu 让 git 命令支持 Tab 键补全功能

前段时间通过网络重装方式重装了 Ubuntu,装上 git 以后发现无法自动补全(例如输入 git br 则自动补全为 git branch),通过查找发现少了一个软件包。

于是我们可以通过如下命令装上:

Debian/Ubuntu

apt install bash-completion -y

装完重新打开终端,就可以支持 git 命令自动补全了。