1. docker
由于项目采用容器部署,因此,需要先安装docker,但是在内网中,需要采用离线安装。
下载地址:https://download.docker.com/linux/static/stable
将相关部署包放到服务器上,执行如下命令即可完成docker安装
# 解压
# 注意必须重新解压,否则会【Failed to start Docker Application Container Engine】的报错
cd /opt/docker/
tar -zxvf docker-20.10.9.tgz
# 移动到指定目录
cp -p docker/* /usr/bin
# 将预先准备的配置文件复制到指定目录
cp docker.service /usr/lib/systemd/system/
systemctl daemon-reload
systemctl start docker
systemctl status docker.service
2. 图数据库部署
将预先准备的数据库安装包、控制台、测试数据复制到集群的master服务器的指定的目录,并复制到其他所有节点
scp -r /opt/nebula ip2:/opt
关闭集群各节点间的防火墙
systemctl stop firewalld
2.1 图数据库
在集群所有节点上执行如下操作
cd /opt/nebula
rpm -ivh nebula-graph-3.2.0.el7.x86_64.rpm
cd /usr/local/nebula/etc
vi nebula-graphd.conf
vi nebula-metad.conf
vi nebula-storaged.conf
在集群的所有节点上,对上述3个配置文件中的如下两个参数进行修改,不同的服务器上ip根据实际ip进行修改
--meta_server_addrs=ip1:9559,ip2:9559,ip3:9559
--local_ip=ip1
在集群的所有节点上,启动数据库
/usr/local/nebula/scripts/nebula.service start all
# 查看服务状态
/usr/local/nebula/scripts/nebula.service status all
登录客户端,添加hosts
chmod -R 777 /opt/nebula
/opt/nebula/nebula-console -addr ip1 -port 9669 -u root -p nebula
ADD HOSTS ip1:9779, ip2:9779, ip3:9779
2.2 建图与建节点、边
由于nebula是强schema数据库,需要预先定义图、点、边的名称和属性字段,才能继续入库,并且定义好之后,还需要建立点、边的索引才能进行查询。将相关脚本整理存入txt中,采用nebula-console客户端进行图数据库后,依次执行即可。
2.3 入库
预先准备相关测试的csv文件,以及config文件,采用nebula-import进行入库,分别执行如下命令,完成节点、边的入库
/opt/nebula/nebula-importer --config /opt/nebula/edi/node_config.yaml
/opt/nebula/nebula-importer --config /opt/nebula/edi/edge_config.yaml
2.4 备份与恢复
将nebula-br和agent部署文件复制到服务器上,启动agent
/opt/nebula/agent --agent="ip1:8888" --meta="ip1:9559" --ratelimit=1048576 > nebula_agent.log 2>&1 &
# 登录图数据库,查看agent是否为online状态
SHOW HOSTS AGENT;
备份命令
# 备份到本地
/opt/nebula/nebula-br/bin/br backup full --meta "ip1:9559" --storage "local:///opt/nebula/backup/"
# 备份到s3
恢复命令
# 查看备份信息
/opt/nebula/nebula-br/br show --storage "local:///opt/nebula/backup"
# 恢复
/opt/nebula/nebula-br/br restore full --meta "ip1:9559" --storage "local:///opt/nebula/backup/" --name BACKUP_2022_12_08_18_38_08
3. kerberos安全策略下的组件访问
3.1 ntp离线部署
由于kerberos通过TGT票据授信的方式进行安全控制,客户端与服务器的时钟需要同步,因此,需要安装ntp服务。
将ntp的3个安装包复制到/opt目录下,并执行安装
cd /opt/ntp
rpm -ivh --force autogen-libopts-5.18-5.el7.x86_64.rpm
rpm -ivh --force ntpdate-4.2.6p5-29.el7.centos.2.x86_64.rpm
rpm -ivh --force ntp-4.2.6p5-29.el7.centos.2.x86_64.rpm
若报错,则执行
rpm -ivh libedit-3.0-12.20121213cvs.el7.x86_64.rpm
配置ntp,将ntp.conf文件复制到/etc目录
mv /etc/ntp.conf /etc/ntp.conf.bak
在/etc/ntp.conf文件中添加如下配置
# ip为需要同步的服务器的ip
server <ip>
启动ntp服务
systemctl start ntpd
systemctl status ntpd
如果在容器中,这一命令会启动失败,因为容器中没有systemctl的执行权限,需要以特权模式运行容器才可以
docker run -tid --name base --privileged=true -t xx:1.0 /usr/sbin/init
3.2 kinit
由于服务器内网通过kerberos进行访问控制,因此需要安装kinit客户端。
# 获取安装包,进行install
cd /opt/client/FusionInsight_Cluster_1_Services_ClientConfig
./install.sh /opt/hadoopclient
安装完毕后,使用kinit命令获取票据
cd /opt/hadoopclient
source bigdata_env
kinit <username>
# 上述步骤可以通过此命令一次完成
# 每次打开xshell窗口时,需要进行一次source
source /opt/hadoopclient/bigdata_env <username> <user.keytab>
# 之后每24小时执行如下命令属性票据
kinit -kt <user.keytab> <username>
# 查看票据的状态
klist
之后,通过curl命令可以访问es
curl -XGET --negotiate -k -u : -H "Content-Type: application/json" '10.30.239.211:9200/'
在容器中安装时,需要注释./install.sh中448行mv dest_temp_hosts /etc/hosts的命令,这同样是因为容器内没有执行权限。需要将数据云平台的服务器ip和域名手动追加到/etc/hosts中。
3.3 Python访问
尽管可以通过curl在shell客户端进行访问,但开发过程中需要通过python客户端访问es,即python需要获取kerberos的授权,安装如下两个依赖包
gssapi==1.7.3
requests-kerberos==0.14.0
使用requests-kerberos前,需要在客户端上对组件的业务用户user进行kinit授权
如果采用url的方式访问es,并且执行的是比较简单的查询,可以采用requests的方法。
import requests
from requests_kerberos import HTTPKerberosAuth
url = 'https://10.30.239.211:9200'
r = requests.get(url, auth=HTTPSKerberosAuth(), verify=False)
print(r.text)
由于项目的es查询比较复杂,因此,仍然使用python的es客户端进行访问,此时,需要给Elasticsearch套一层HTTPKerberosAuth,具体参数配置如下。
from requests_kerberos import HTTPKerberosAuth
from elasticsearch import Elasticsearch, RequestsHttpConnection
url = 'https://10.30.239.211:9200'
es = Elasticsearch(hosts=[url], verify_certs=False, connection_class=RequestsHttpConnection, http_auth=HTTPKerberosAuth(mutual_authentication=3)
dsl = {'size': 1, 'query': {'match_all': {}}}
es_result = es.search(index="company_graph", body=body)
print(es_result)
由于kafka-python集成了kerberos的认证支持,因此,python访问kafka较为简单,kinit之后才有如下代码即可访问。
from kafka import KafkaProducer
producer = KafkaProducer(
bootstrap_servers=['%s:%s' % (config_map["kafka"]["ip"], config_map["kafka"]["port"])],
security_protocol='SASL_PLAINTEXT',
sasl_mechanism='GSSAPI',
sasl_kerberos_domain_name='hadoop.hadoop.com',
api_version=(0, 10)
)
producer.send(topic_name,value=json.dumps(log_data, ensure_ascii=False).encode('utf-8'))
在shell上验证kafka能否正常发送接收消息的命令如下
/opt/hadoopclient/Kafka/kafka/bin/
4. 部署的一些问题
- 页面嵌入时报错:X_FRAME_OPTIONS
注释掉setting.py中的此行
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
# 跨站请求伪造缺陷
'django.middleware.csrf.CsrfViewMiddleware',
# 注释此行
# 'django.middleware.clickjacking.XFrameOptionsMiddleware',
'src.action.log_middleware.LogMiddleware',
]